字符串移位之后是否包含另一字符串之java实现

字符串移位之后是否包含另一字符串之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代码实现。如果有更不错的方法,欢迎评论!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修罗debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值