当前任务:重复子字符串 给定一个字符串 s,判断它是否由它的子串重复多次构成。如果由子串重复多次构成,输出子串,否则输出整个字符串。 任务要求 给定字符串 s 为 str 类型,输出字符串为 str 类型。 测试用例 输入:'abcabc' 输出:'abc' 输入:'abefd' 输出:'abefd' 输入:'' 输出:''
时间: 2023-12-10 13:06:00 浏览: 155
```python
def repeatedSubstring(s):
n = len(s)
for i in range(1, n // 2 + 1):
if n % i == 0:
sub = s[:i]
if sub * (n // i) == s:
return sub
return s
```
相关问题
使用kotlin完成这个题目:459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
这道题可以使用字符串匹配的方法来解决。
具体来说,我们可以将原始字符串 s 拼接自身,然后去掉开头和结尾两个字符,这样得到的字符串一定包含原始字符串 s。
接下来,我们可以使用 KMP 算法或者 Z 算法来求出该字符串的前缀函数或者 Z 函数,然后判断原始字符串 s 的长度是否等于这个函数的最后一个值,如果是,说明原始字符串 s 可以由一个子串重复多次构成。
具体实现可以参考以下代码:
```kotlin
fun repeatedSubstringPattern(s: String): Boolean {
val n = s.length
val str = s + s
val pi = IntArray(n * 2)
var j = 0
for (i in 1 until n * 2) {
while (j > 0 && str[i] != str[j]) {
j = pi[j - 1]
}
if (str[i] == str[j]) {
j++
}
pi[i] = j
}
return pi[n * 2 - 1] != 0 && n % (n - pi[n * 2 - 1]) == 0
}
```
其中,`pi` 数组表示字符串 `str` 的前缀函数,`j` 表示匹配的长度,初始值为 `0`。
在循环中,我们不断地向右移动指针 `i`,并且不断地将 `j` 更新为 `pi[j-1]`,直到 `str[i]` 和 `str[j]` 相等,或者 `j` 为 `0`。如果 `str[i]` 和 `str[j]` 相等,我们就将 `j` 增加 1,并且将 `pi[i]` 赋值为 `j`。
最后,我们判断 `pi[n*2-1]` 是否为 0,并且判断 `n` 是否能被 `n-pi[n*2-1]` 整除。如果是,说明原始字符串 s 可以由一个子串重复多次构成,返回 true,否则返回 false。
希望能对你有所帮助!
求一个字符串中最长无重复字符子字符串长度js 源字符串:abcabcabc 子字符串:abca,abc,ab, a 无重复字符的子字符串:abc,ab, a无重复字符的最长子字符串:abc返回结果:3
要找到给定字符串中最长无重复字符子字符串的长度,可以使用滑动窗口(sliding window)算法。这里以JavaScript为例来实现:
```javascript
function lengthOfLongestSubstring(s) {
let maxLength = 0;
let charMap = {};
let left = 0;
for (let right = 0; right < s.length; right++) {
if (charMap[s[right]]) { // 如果遇到重复字符
left = Math.max(charMap[s[right]] + 1, left); // 更新左边界,跳过重复字符的区间
}
charMap[s[right]] = right; // 更新字符映射
maxLength = Math.max(maxLength, right - left + 1); // 更新最长子串长度
}
return maxLength;
}
// 示例
const inputString = "abcabcabc";
console.log(lengthOfLongestSubstring(inputString)); // 输出:3
```
在这个代码中,我们维护了一个字符映射`charMap`用于记录每个字符最后一次出现的位置,以及一个双指针`left`和`right`表示当前查找区间的左右边界。当遇到重复字符时,我们更新左边界以跳过重复字符,然后继续计算新的最长子串长度。
阅读全文