题目描述:
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。
示例 1:
输入: s = “abcde”, goal = “cdeab”
输出: true
示例 2:
输入: s = “abcde”, goal = “abced”
输出: false
提示:
1 <= s.length, goal.length <= 100
s 和 goal 由小写英文字母组成
c++代码:
class Solution {
public:
bool rotateString(string s, string goal) {
if(s==goal)return true;
int n=s.length();
int m=goal.length(); //长度不同肯定不能相等,不需旋转,直接返回false
if(n!=m)return false;
for(int i=1;i<n;i++){
string ss=s.substr(i)+s.substr(0,i);
if(ss==goal)return true;
}
return false;
}
};
python代码:
class Solution(object):
def rotateString(self, s, goal):
if s==goal:
return True
n = len(s)
if n!=len(goal):
return False
for i in range(1,n):
ss=s[i:]+s[0:i]
if ss==goal:
return True
return False
优化:若a可以通过循环等于b,那b一定在a+a中,a+a这个字符串中包含了全部a循环的可能结果。
python代码:
class Solution(object):
def rotateString(self, s, goal):
if s==goal:
return True
n = len(s)
if n!=len(goal):
return False
s=s+s
if goal in s:
return True
return False
总结:
脑筋急转弯,字符串问题,字符串a的所有循环结果都被包含在a+a中,直接判断a+a,节省执行字符串拼接的循环过程。