当前位置: 面试刷题>> 重复的子串模式 (经典算法题500道)
### 完整题目描述
**题目:重复的子串模式**
给定一个字符串 `s`,判断字符串 `s` 是否由至少两个完全相同的子串连接而成。例如,字符串 `"aabcaabc"` 可以由 `"aabc"` 重复两次得到,因此返回 `true`。而 `"abcabcabc"` 虽然是重复的,但它由三个 `"abc"` 构成,不是由至少两个相同的子串重复而成(题目要求至少两个相同且完整的子串重复),所以按照此题目的严格定义,它应返回 `false`。
### 示例
- 输入: `"aabcaabc"`
- 输出: `true`
- 输入: `"abcabcabc"`
- 输出: `false`
- 输入: `"ababab"`
- 输出: `true`
### 解题思路
一个高效的方法是使用 KMP 算法(Knuth-Morris-Pratt 算法)的变种来寻找字符串中的最长相同前缀和后缀,但这对于面试来说可能过于复杂。一个更简单直观的方法是使用字符串拼接和比较。具体地,我们可以尝试将字符串 `s` 与它自身拼接后的字符串 `s+s` 进行比较(去掉首尾的重复部分),看是否存在一个长度等于原字符串长度一半的子串,使得这个子串与原字符串相同。
### PHP 示例代码
```php
function repeatedSubstringPattern($s) {
$len = strlen($s);
$concat = $s . $s;
// 去掉首尾相同的部分
$trimmedConcat = substr($concat, 1, $len * 2 - 2);
return strpos($trimmedConcat, $s) !== false;
}
// 测试
echo repeatedSubstringPattern("aabcaabc") ? "true" : "false"; // 输出 true
echo "\n";
echo repeatedSubstringPattern("abcabcabc") ? "true" : "false"; // 输出 false
echo "\n";
echo repeatedSubstringPattern("ababab") ? "true" : "false"; // 输出 true
```
### Python 示例代码
```python
def repeatedSubstringPattern(s):
return (s + s).find(s, 1, len(s) * 2 - 1) != -1
# 测试
print(repeatedSubstringPattern("aabcaabc")) # 输出 True
print(repeatedSubstringPattern("abcabcabc")) # 输出 False
print(repeatedSubstringPattern("ababab")) # 输出 True
```
### JavaScript 示例代码
```javascript
function repeatedSubstringPattern(s) {
const concat = s + s;
// 去掉首尾相同的部分,因为JavaScript的substring不包括结束索引
const trimmedConcat = concat.substring(1, concat.length - 1);
return trimmedConcat.includes(s);
}
// 测试
console.log(repeatedSubstringPattern("aabcaabc")); // 输出 true
console.log(repeatedSubstringPattern("abcabcabc")); // 输出 false
console.log(repeatedSubstringPattern("ababab")); // 输出 true
```
**码小课**网站中有更多关于算法和数据结构的相关内容分享,欢迎大家学习交流!