写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC
时间: 2024-04-07 22:30:36 浏览: 162
题目中要求编写一个函数,判断一个字符串是否为另一个字符串旋转之后的结果。举例来说,给定s1="aabcd"和s2="bcdaa",那么s2是通过将s1右移两位得到的,因此符合条件,函数应该返回1。如果s2是通过对s1进行左移、上下翻转等操作得到的,那么不符合条件,函数应该返回0。
如果给定s1="aabcd"和s2="acbd",那么s2无法通过将s1旋转得到,函数应该返回0。
如果给定s1="aabcd"和s2="daabc",那么s2是通过将s1左移两位得到的,然后再翻转得到的,符合条件,函数应该返回1。
思路:因为只需要判断是否旋转一个字符串得到另一个字符串,因此可以重复将s1串连接到自身的末尾,然后判断s2是否为s1串中的一个子串即可。在判断子串的过程中,可以使用KMP等算法提高效率。
相关问题
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =aabcd和s2 = bcdaa,返回1 给定s1=abcd和s2=acbd,返回0. aabcd左旋一个字符得到abcda aabcd左旋两个字符得到bcdaa aabcd右旋一个字符得到daabc
题目中要求编写一个函数,判断一个字符串是否为另一个字符串旋转之后的结果。举例来说,给定s1="aabcd"和s2="bcdaa",那么s2是通过将s1右移两位得到的,因此符合条件,函数应该返回1。如果s2是通过对s1进行左移、上下翻转等操作得到的,那么不符合条件,函数应该返回0。
如果给定s1="aabcd"和s2="acbd",那么s2无法通过将s1旋转得到,函数应该返回0。
如果给定s1="aabcd"和s2="daabc",那么s2是通过将s1左移两位得到的,然后再翻转得到的,符合条件,函数应该返回1。
思路:因为只需要判断是否旋转一个字符串得到另一个字符串,因此可以重复将s1串连接到自身的末尾,然后判断s2是否为s1串中的一个子串即可。在判断子串的过程中,可以使用KMP等算法提高效率。
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。 给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。用Java写出
可以通过暴力枚举的方式来解决这个问题。具体来说,可以对s1进行多次循环移位操作,得到若干个新的字符串,然后判断s2是否为这些新字符串的子串。
代码如下所示:
```java
public static boolean isSubstring(String s1, String s2) {
if(s1 == null || s2 == null || s1.length() != s2.length()) {
return false;
}
String s = s1 + s1; // 将s1重复一次,得到一个新的字符串
return s.indexOf(s2) != -1; // 判断s2是否为s1的移位包含
}
```
这个函数的时间复杂度是O(n^2),其中n是字符串的长度。因为需要对一个长度为n的字符串进行n次循环移位操作,并且每次循环移位操作需要重新构造一个长度为2n的新字符串,因此总共需要进行n^2次字符操作。
阅读全文