思路:
题目的主要信息:
- 重复字符串是由两个相同的字符串首尾拼接而成,不存在覆盖
- 返回的是字串长度,为重复部分的2倍,必为偶数
- 若不存在任何重复字符子串,则返回0
方法一:暴力解法(超时)
具体做法:
n记录最长的重复字串的重复长度,从字符串长度一半开始,然后依次比较后面的n个字符及再后面的n个字符是否相等,若是相等返回即可,若是不等则需要将n减一,相当于缩短重复字串长度继续。
class Solution { public: int solve(string a) { int n = a.length() / 2; //记录最长的重复字串的重复长度,从字符串长度一半开始 bool flag = true; //记录是否出现过不相等 for(int i = n; i > 0; i--) for(int j = 0; j <= a.length() - i - 1; j++){ for(int k = j; k < j + n; k++){ if(a[k] != a[k + i]) flag = false; } if(flag) //未出现不相等, return 2 * i; flag = true; } return 0; } };
复杂度分析:
- 时间复杂度:,三层循环
- 空间复杂度:,只有临时变量,无额外空间
方法二:二分+字串比较
具体做法:
二分思想,如果存在重复子串的重复部分max的话,,然后逐步递减到0.比较的时候可以不用一个字符一个字符地比较。而是截取max长度,直接比较整串。
class Solution { public: int solve(string a) { int max = a.length() / 2; while(max > 0){ int i = 0; while(i + max * 2 <= a.length()){ if(a.substr(i, max) == a.substr(i + max, max)) //比较相邻max个字串是否相等 return max * 2; i++; } max--; //减少最长长度,继续查找 } return max; } };
复杂度分析:
- 时间复杂度:,二分查找,加上比较
- 空间复杂度:,无额外空间