程序员面试金典: 9.1数组与字符串 8判断两个字符串中一个字符串是否由另一个字符串旋转而成

#include 
#include 
#include  

using namespace std;

/*
问题:假定有一个方法isSubstring,可以检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2.请编写代码检查s2是否为
      s1旋转而成,要求只能调用一次isSubstring。(比如,waterbottle是erbottlewat旋转后的字符串)
分析:如果先排序就会丢失掉旋转的特性,该方法不通。关键是如何查找到旋转的位置,然后用子串进行查找.
      我突然想起来了,把旋转之后的字符串与其本身拼接在一起,必定能够找到原字符串
	  比如设该字符串为xy,旋转后变为yx,然后两次拼接为yxyx,中间包含了xy
	  其他注意地方:长度不等不是旋转而成的

输入:
waterbottle erbottlewat
chaoma mchaoa
输出:
yes
no

关键:
1 设该字符串为xy,旋转后变为yx,然后两次拼接为yxyx,中间包含了xy。
  两次字符串拼接验证是否旋转而成
*/

bool isSubstring(string& str , string& subString)
{
	if(subString.length() > str.length() )
	{
		return false;
	}
	int pos = str.find(subString , 0);
	if(string::npos == pos)
	{
		return false;
	}
	else
	{
		return true;
	}
}

bool isRotate(string& str1 , string& str2)
{
	if( str1.length() != str2.length() )
	{
		return false;
	}
	string sResult = str2.append(str2);
	return isSubstring(sResult , str1);
}

int main(int argc, char* argv[])
{
	string str1 , str2;
	while(cin >> str1 >> str2)
	{
		bool isSub = isRotate(str1 ,str2);
		if(isSub)
		{
			cout << "yes" << endl;
		}
		else
		{
			cout << "no" << endl;
		}
	}
	system("pause");
	return 0;
}

你可能感兴趣的:(程序员面试金典)