重复的子字符串

[复制链接]
发表于 2025-10-10 13:25:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
碰到一道算法题,可以按照以下思考流程举行,克制没有思绪。
一.暴力遍历罗列 -> 2.模拟利用 ->3.常用的算法本领或题型,比如双指针,滑动窗口,动态规划,回溯算法之类
通常末了的解法都是在暴力遍历或罗列或模拟利用办理的过程中,发现题目的内涵性子,从而找到更好的方法。
但是除了数学建模这类的题目,要使用数学知识,其他的本质还是穷举出全部的效果,只不外动态规划发现了最优子结构,回溯举行了剪枝,不必列出全部的效果,不重复,不遗漏。
1.暴力罗列
罗列子字串长度分别为1,2,3,......, str.size() / 2,按子串长度区间去匹配,判定是否能构成字串str。
比方:abcabcabc,罗列子串长度为2时,每个i, str == str[i - 2],假如不相称,阐明不能构成该字串。
参考代码:
  1. class Solution {
  2. public:
  3.     bool repeatedSubstringPattern(string s) {
  4.         for (int i = 1; i * 2 <= s.size(); ++i) {//遍历所有可能的子串长度
  5.             if (s.size() % i == 0) {//判断是否能组成该字串
  6.                 bool matchFlag = true;
  7.                 for (int j = i; j < s.size(); ++j) {
  8.                     if (s[j] != s[j - i]) {
  9.                         matchFlag = false;
  10.                         break;
  11.                     }
  12.                 }
  13.                 if (matchFlag)
  14.                     return true;
  15.             }
  16.         }
  17.         return false;
  18.     }
  19. };
复制代码
只要把握暴力罗列即可,下面的解法大概想不到,可以死记硬背下来,看成结论使用。
2.根据重复子串构成字串的性子:假设字串为s,那么ss字串去除首字母和尾字母的字串str,假如str中包罗s,那么s是由自身某个子串重复构成的。各人可以自行搜刮证明。
参考代码:使用Kmp算法举行子串匹配
  1. class Solution {
  2. public:
  3.     bool repeatedSubstringPattern(string s) {
  4.         string str = s + s;
  5.         //构建next数组
  6.         vector<int> next(s.size(), 0);
  7.         for(int i = 1, j = 0; i < s.size(); ++i){
  8.             while(j > 0 && s[j] != s[i]){
  9.                 j = next[j - 1];
  10.             }
  11.             if(s[j] == s[i]){
  12.                 ++j;
  13.             }
  14.             next[i] = j;
  15.         }
  16.         //匹配子串
  17.         for(int i = 1, j = 0; i < str.size() - 1; ++i){
  18.             while(j > 0 && str[i] != s[j]){
  19.                 j = next[j - 1];
  20.             }
  21.             if(str[i] == s[j]){
  22.                 j++;
  23.             }
  24.             if(j == s.size())
  25.                 return true;
  26.         }
  27.         return false;
  28.     }
  29. };
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表