字符串移位之后是否包含另一字符串之java实现
对源字符串srcStr进行若干次移位,判断是否包含另一字符串desStr。
举个例子,srcStr="AABBCD" desStr="CDAA" ,则符合上面的叙述,只需要将srcStr中的CD先后左移即可。下面采用两种方式实现这一算法。
第一种方法:每一次将srcStr进行若干次的左移或者右移(会发现是同一个道理)srcStr.length()次,然后在每一次中检查是否包含目的字符串desStr。
相应的java程序如下:
<span style="font-size:14px;">/**
*
* @author zhonglinsen
* 字符串旋转 后 是否包含指定的字符串 AABBCD旋转后则会包含 CDAA
*/
public class StringRotateIncludeOne {
/**
* @param src 待旋转的源字符串
* @param des 待检测的是否被包含的字符串
* @return true:即包含
*/
public boolean StringRotateInclude(char[] src,char[] des){
boolean flag=false;
for (int i = 0; i < src.length; i++) {
//字符串的循环移位
char tempChar=src[0];
for (int j = 0; j < src.length-1; j++) {
src[j]=src[j+1];
}
src[src.length-1]=tempChar;
//字符数组 转 字符串
String srcStr=String.valueOf(src);
String desStr=String.valueOf(des);
//判断是否包含某一个字符串
if (srcStr.contains(desStr)) {
flag=true;
break;
}
}
return flag;
}
public static void main(String[] args) {
//字符串 转 字符数组
char[] srcStr="AABBCD".toCharArray();
char[] desStr="CDAAS".toCharArray();
StringRotateIncludeOne sri=new StringRotateIncludeOne();
boolean res=sri.StringRotateInclude(srcStr, desStr);
System.out.println(res);
}
}</span>
其中需要注意的是,字符数组char[] des转字符串String的方法并不是将字符数组char[] des 直接des.toString() ,那样只会得到地址。正确的方式应该是:String.valueOf(des)。
第二种方法:将源字符串srcStr进行左移或者右移srcStr.length(),其中保留待移动的字符在原来的位置上,然后直接判断是否包含目的字符串desStr。即上面的例子中srcStr="AABBCD",左移或者右移实际上用不着,直接两个srcStr即为左移或者右移srcStr.length()后的字符串即 srcStrSec="AABBCDAABBCD",这样子实际上就可以判断是否包含目的字符串了,因为srcStrSec包含了第一种方法中每一次不保留原先字符的左移或者右移后得到的字符串,只要想一想,在草稿纸上描绘秒回
这显然是一种空间换取时间的方法。
java代码如下:
/**
*
* @author zhonglinsen
* 字符串旋转 后 是否包含指定的字符串 AABBCD旋转后则会包含 CDAA
*/
public class StringRotateIncludeOne {
/**
* 第二种方法:空间换时间
* @param src
* @param des
* @return
*/
public boolean StringRotateIncludeTwo(char[] src,char[] des){
boolean flag=false;
String srcReal=String.valueOf(src);
srcReal += srcReal;
String desReal=String.valueOf(des);
if (srcReal.contains(desReal)) {
flag=true;
}
return flag;
}
public static void main(String[] args) {
//字符串 转 字符数组
char[] srcStr="AABBCD".toCharArray();
char[] desStr="CDAAS".toCharArray();
boolean res=sri.StringRotateIncludeTwo(srcStr,desStr);
System.out.println(res);
}
}
以上的题目以及方法来源于“编程之美”,自己觉得不错,只是原书使用C代码实现。如果有更不错的方法,欢迎评论!