牛牛有两个环形字符串s1和s2,他想知道它们是否有可能是同一个字符串,如果是,返回"YES",反之,返回"NO"。
题解:此题如果用排序,然后去判断,复杂度为nlogn,时间不允许。但是我们可以分别求出两个字符串的最小表示法,再循环比较判断是否相等。
时间复杂度:O(n)
空间复杂度:O(1)
参考代码如下:
class Solution {
public:
int getmin(string s)
{
int n = s.size();
int i = 0, j = 1, k = 0, t;
while (i < n && j < n && k < n)
{
t = s[(i + k) % n] - s[(j + k) % n];
if (!t)
k++;
else
{
if (t > 0)
i += k + 1;
else
j += k + 1;
if (i == j)
j++;
k = 0;
}
}
return i > j ? j : i;
}
string solve(string s1, string s2)
{
int n = s1.size();
int m = s2.size();
if (n != m)
{
return "NO";
}
int a = getmin(s1);
int b = getmin(s2);
for (int i = 0; i < n; i++)
if (s1[(a + i) % n] != s2[(b + i) % n])
{
return "NO";
}
return "YES";
}
};
京公网安备 11010502036488号