第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题

问题描述

分析与解法

【解法一】

具体代码如下:

 1 package chapter3jiegouzhifa.QuestionOfStringMove;
 2 /**
 3  * 字符串移位包含的问题
 4  * 【解法一】
 5  * @author DELL
 6  *
 7  */
 8 public class StringMove {
 9     /**
10      * 寻找移位后的字串(左移)
11      * @param src 源字符串
12      * @param des 要查找的子串
13      * @return
14      */
15     public static boolean findSubStr(String src1, String des){
16         char[] src = src1.toCharArray();
17         int n = src.length;
18         for(int i=0;i<n;i++){
19             StringBuffer sb = new StringBuffer();  //用于存放移位后的字符串
20             char temp = src[0];
21             for(int j=0;j<n-1;j++){
22                 src[j] = src[j+1];
23                 sb.append(src[j+1]);
24             }
25             src[n-1] = temp;
26             sb.append(temp);
27             //判断是否包含
28             if(sb.toString().contains(des))
29                 return true;
30         }
31         return false;
32     }
33     public static void main(String[] args) {
34         String src = "AABCD";
35         String des = "CDAA";
36         if(findSubStr(src,des))
37             System.out.println("可以通过循环移位得到!");
38         else
39             System.out.println("不可以通过循环移位得到!");
40     }
41 
42 }

程序运行结果如下:

可以通过循环移位得到!

【解法二】

这种解法存在一个bug:s1="A", s2="AA". 解决办法:先比较一下长度。

具体代码如下:

 

 1 package chapter3jiegouzhifa.QuestionOfStringMove;
 2 /**
 3  * 字符串移位包含的问题
 4  * 【解法二】
 5  * @author DELL
 6  *
 7  */
 8 public class StringMove2 {
 9     /**
10      * 寻找移位后的字串(左移)
11      * @param src 源字符串
12      * @param des 要查找的子串
13      * @return
14      */
15     public static boolean findSubStr(String src, String des){
16         if(src.length()<des.length())
17             return false;
18         StringBuffer sb = new StringBuffer(); 
19         sb.append(src);
20         sb.append(src);
21         //判断是否包含
22         if(sb.toString().contains(des))
23             return true;
24         else
25             return false;
26     }
27     public static void main(String[] args) {
28         String src = "AABCD";
29         String des = "CDAA";
30         if(findSubStr(src,des))
31             System.out.println("可以通过循环移位得到!");
32         else
33             System.out.println("不可以通过循环移位得到!");
34     }
35 
36 }

程序运行结果如下:

可以通过循环移位得到!

总结

  第二种方法利用了“提高空间复杂度来换取时间复杂度的降低”的思路,适用于对时间复杂度要求高的场合。

 

posted @ 2015-07-15 21:52  ~风轻云淡~  阅读(389)  评论(0编辑  收藏  举报