牛牛有两个环形字符串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"; } };