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

代码随想录刷题——字符串篇(七)

459.重复的子字符串

移动匹配法:

bool repeatedSubstringPattern(string s) {# 组成新串string t=s+s;# 去除首尾字符t.erase(t.begin());t.erase(t.end()-1);# 判断中间是否有与原字符串相等的子串if(t.find(s)!=npos) return true;return false;}

KMP法:

# 获取next数组
void getNext(int* next,const string& s){next[0]=0;int i=0;for(int j=1;j<s.size();j++){while(i>0&&s[i]!=s[j]){i=next[i-1];}if(s[i]==s[j]){i++;}next[j]=i;}} 
bool repeatedSubstringPattern(string s) {vector<int> next(s.size());getNext(&next[0], s);int n=s.size();# 如果next数组最后一位不为0则存在最长相等前后缀,再判断最长重复子串的长度# 是否可以被字符串长度整除即可if(next[n-1]!=0 && n%(n-next[n-1])==0) return true;return false;}

其他:

(1)移动匹配法非常巧妙,相当于把一个字符串写两遍去掉首尾字符(因为一个字符串如果自循环构成长度一定大于等于2),再查找原字符串是否仍存在,如果存在则一定自循环,举个例子(空格是为了好观察):

                s="abc abc abc"

                t=s+s="abc abc abc abc abc abc"

                去掉首位字符后=“bc abc abc abc abc ab"此时由于自循环的缘故,中间部分一定会出现与原始字符串相同的子串,充分必要性的数学证明网站中有

(2)字符串相关:

                a.重载了+运算符

                b. t.find(s)!=string::npos 判断写法,string作用域下的npos

(3)KMP法则是利用最长相等前后缀来找最小重复子串,一个示意图就很清晰:

http://www.lryc.cn/news/626189.html

相关文章:

  • 机械原理的齿轮怎么学?
  • Transformer中的编码器和解码器是什么?
  • ubuntu安装kconfig-frontends提示报错
  • SpringAI——向量存储(vector store)
  • 【Netty4核心原理⑫】【异步处理双子星 Future 与 Promise】
  • 企业架构是什么?解读
  • Leetcode 深度优先搜索 (6)
  • 骑行初体验
  • 从“为什么”到“怎么做”——Linux Namespace 隔离实战全景地图
  • CentOS安装SNMPWalk
  • Vue.prototype 的作用
  • 基于 STM32 单片机的远程老人监测系统设计
  • 从踩坑到精通:Java 深拷贝与浅拷贝
  • 算法题Day3
  • 1688商品详情API接口操作指南及实战讲解
  • 告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
  • 信号和共享内存
  • 理解MCP:开发者的新利器
  • string 题目练习 过程分析 具体代码
  • Redis(10)如何连接到Redis服务器?
  • Git#revert
  • Pandas 入门到实践:核心数据结构与基础操作全解析(Day1 学习笔记)
  • 跟随广州AI导游深度探寻广州历史底蕴​
  • Linux Namespace 隔离的“暗面”——故障排查、认知误区与演进蓝图
  • Python day49.
  • 嵌入式第三十二天(信号,共享内存)
  • 机器学习概念(面试题库)
  • 8.19笔记
  • Python + 淘宝 API 开发:自动化采集商品数据的完整流程​
  • python新工具-uv包管理工具