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

原创 2015年11月20日 21:00:54

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

字符的左右移动-java

题目:字符串移动(字符串为号和26个字母的任意组合,把号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小.解析:主要问题是时间复杂度和空间复杂度,不过不考虑时间和空间复杂...
  • lwxdjk
  • lwxdjk
  • 2016年06月21日 11:23
  • 803

编程之美中判断某个字符串是否是另一个字符串的移位结构的子串

#include #include using namespace std; bool is_circle(string src,string des) { if(src.empty()||des....

判断一个字符串是否为另一个字符串的旋转后的子字符串

题目: 假定我们现在又一个函数isSubString(const string& str1, const string& str2)能够判断出字符串str2是否为str1的子串,那请给出一个方法能够...
  • acaiwlj
  • acaiwlj
  • 2013年09月08日 11:23
  • 1027

overflow不一定能隐藏元素(position:absolute)

overflow不能隐藏元素的情况

web开发常见安全问题

xss注入 概念XSS又叫CSS(Cross Site Script),跨站脚本攻击。指的是恶意攻击者往web页面里插入恶意脚本代码,而程序对于用户输入内容没有过滤,当用户浏览时,嵌入的脚本代码被执行...

Java实现以字符串某一位置为界,将它之前的部分与之后的部分互换位置

下面的代码主要解决的问题是:给定一个字符串str和一个整数i,i代表字符串中某一个元素的下标,将str[0..i-1]移到这个元素的右侧,将str[i+1..len(str)-1]移到这个元素的左侧。...

【代码向】字符串KMS算法,判断某一字符串是否包含另一字符串

public static class KMS { #region Defines public const int StringStartIndex = 0;...

(KMP 1.6)hdu 2203 亲和串(判断文本串循环移位之后是否能将模式串包含在其中)

题目:亲和串Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi...

编程之美3.1——字符串移位包含的问题(KMP算法)

问题: 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位得到的字符串包含。 解法: 我们在对s1进行循环移位时,保留前面移走的数据,会发现只要将s1复制一份接在后面就能够包...

每日一题(73) - 字符串移位包含的问题

题目来自剑指offer 题目 思路 代码 #include #include using namespace std; bool IsInclude(char strA[],char strB[...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串移位之后是否包含另一字符串之java实现
举报原因:
原因补充:

(最多只允许输入30个字)