字符串包含问题的求解

我们在参加笔试或者写代码的时候总会与字符串打交道,今天主要想说的是如何解决字符串包含的问题。
问题是,给你一个字符串然后让你循环移位能否得到一个给定的字符串,比如给你ABCDE 能否将其进行移位得到CDEA,这样的问题。
遇到这样的 问题我们可能第一件事就是对其进行循环移位,这个方法是没有问题的,但是我们想想如果字符串很长很长,那么我们的效率是不是会很高呢?时间复杂度应该为字符串的长度。这样肯定效率不是很高的。下面我们来进行分析。
ABCDE进行移位得到的结果为:
            ABCDE ->BCDEA -> CDEAB -> DEABC -> EABCD -> ABCDE
我们这样来看,
            BCDEA = ABCDE ABCDE 去掉前面的A字母和后面的BCDE字母
            CDEAB = ABCDE ABCDE 去掉前面的AB字母和后面的CDE字母
            同理。。。。。。。。
我们发现不管怎么旋转ABCDE都是可以由ABCDEABCDE截取下来得到的。
所以我们的问题也就解决了,我们把原来的字符串进行相叠加,也就是将ABCDE叠加为ABCDEABCDE,这样我们在判断移位得到子串的时候就直接进行判断是否包含就可以知道能不能从原来的字符串移位得到了。
所以这样的一个方法就使我们的程序变得非常的简单了。

下面是一个简单的例子来说明下:

package testString; 

public class TestString { 
	
/** 
* @param args 
	*/ 
	public static boolean isContent(String str1,String str2) 
	{ 
		//str1为原来的字符串,str2为能否得到的字符串 
		String tem = str1+ str1; 
		boolean result = tem.contains(str2); 
		return result; 
	} 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		String str1 = "ABCDE"; 
		String str2 = "CDEA"; 
		System.out.println(isContent(str1, str2)); 
	} 
	
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值