字符串移位包含的问题
问题描述
分析与解法
【解法一】
具体代码如下:
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 }
程序运行结果如下:
可以通过循环移位得到!
总结
第二种方法利用了“提高空间复杂度来换取时间复杂度的降低”的思路,适用于对时间复杂度要求高的场合。