当前位置: 首页 > news >正文

重复的子字符串

碰到一道算法题,可以按照以下思考流程进行,避免没有思路。

一.暴力遍历枚举 -> 2.模拟操作 ->3.常用的算法技巧或题型,比如双指针,滑动窗口,动态规划,回溯算法之类

通常最后的解法都是在暴力遍历或枚举或模拟操作解决的过程中,发现问题的内在性质,从而找到更好的方法。

但是除了数学建模这类的问题,要使用数学知识,其他的本质还是穷举出所有的结果,只不过动态规划发现了最优子结构,回溯进行了剪枝,不必列出所有的结果,不重复,不遗漏。

1.暴力枚举

枚举子字串长度分别为1,2,3,......, str.size() / 2,按子串长度区间去匹配,判断是否能构成字串str。

例如:abcabcabc,枚举子串长度为2时,每个i, str[i] == str[i - 2],如果不相等,说明不能组成该字串。

参考代码:

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        for (int i = 1; i * 2 <= s.size(); ++i) {//遍历所有可能的子串长度
            if (s.size() % i == 0) {//判断是否能组成该字串
                bool matchFlag = true;
                for (int j = i; j < s.size(); ++j) {
                    if (s[j] != s[j - i]) {
                        matchFlag = false;
                        break;
                    }
                }
                if (matchFlag)
                    return true;
            }
        }
        return false;
    }
};

只要掌握暴力枚举即可,下面的解法可能想不到,可以死记硬背下来,当作结论使用。

2.根据重复子串组成字串的性质:假设字串为s,那么ss字串去除首字母和尾字母的字串str,如果str中包含s,那么s是由自身某个子串重复组成的。大家可以自行搜索证明。

参考代码:使用Kmp算法进行子串匹配

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string str = s + s;
        //构建next数组
        vector<int> next(s.size(), 0);
        for(int i = 1, j = 0; i < s.size(); ++i){
            while(j > 0 && s[j] != s[i]){
                j = next[j - 1];
            }
            if(s[j] == s[i]){
                ++j;
            }
            next[i] = j;
        }
        //匹配子串
        for(int i = 1, j = 0; i < str.size() - 1; ++i){
            while(j > 0 && str[i] != s[j]){
                j = next[j - 1];
            }
            if(str[i] == s[j]){
                j++;
            }
            if(j == s.size())
                return true;
        }
        return false;
    }
};

相关文章:

  • linux常用符号
  • dcat-admin已完成项目部署注意事项
  • 软件工程面试题(三)
  • redis集群的原理是什么?
  • 【C语言】深入理解指针(一):从基础到高级应用
  • 新手村:逻辑回归-理解02:逻辑回归中的伯努利分布
  • 项目生命周期 和 项目管理生命周期的差异
  • 【002安卓开发方案调研】之Kotlin+Jetpack开发方案
  • 动态规划入门详解
  • 知识图谱中NLP新技术
  • HTML CSS 使div中的子元素横向排列,并均匀分布
  • Android集成Facebook登录与分享的常见问题及解决方案
  • VSCode 抽风之 两个conda环境同时在被激活
  • 用AI在云平台上用自然语言生成定制化SQL查询复杂数据库
  • Spring框架入门指南:从Hello World到IOC容器
  • TPCTF 2025 web 复现
  • 【项目设计】网页版五子棋
  • 2025知识图谱峰会(脱敏)PPT合集(18份).zip
  • css基础-选择器
  • SRS-GB28181 实现浅析之二--基本逻辑与结构
  • 中方在IMF发声:美滥施关税威胁全球金融稳定,对新兴市场和发展中国家构成严峻挑战
  • 对外投资增长、消费市场持续升温,中国经济砥砺前行
  • 巴印在克什米尔发生交火
  • 2025全国知识产权宣传周:用AI生成的图片要小心什么?
  • 胃病、闭经、湿疹、失明:藏在疾病后的情绪问题
  • 长三角议事厅|国际产业转移对中国产业链韧性的影响与对策