关注
先说结论,动态规划,时间复杂度最差为O(n3)。
递推公式为dp[i][j] = str[ dp[i][j-1] +j-i+1 ] ==
str[j]?dp[i][j-1]:dp[dp[i][j-1]]
递推公式优点难懂,举个例子:
abcab
设数组dp[len][len],其中dp[i][j]表示 上一个str[i,j]的开始位置
初始化:因为str[0,0] = a,之前没出现过,dp[0][0] = -1
同理str[1,1] = -1,dp[2][2] = -1,
因为str[3,3] = a,上一次出现的位置为0,因此dp[3][3] = 0
因为str[4,4] = b,上一次出现的位置为1,因此dp[4][4] = 1.
#include <iostream>
#include <vector>
#include <map>
using namespace std;
void getAllSub(const string str){
const int len = str.length();
map<char,int> mymap;
vector<vector<int>>
myvec(len,vector<int>(len,-1));
for(int i =0;i<len;i++){
if(mymap.count(str[i]) == 0){
mymap[str[i]] = i;
}else{
myvec[i][i] = mymap[str[i]];
mymap[str[i]] = i;
}
}
for(int i =0;i<len;i++)
for(int j =i;j<len;j++){
if(i == j){
if(myvec[i][j] != -1 &&
myvec[myvec[i][j]][myvec[i][j]] == -1)
cout<<str.substr(i,1)<<endl;
continue;
}
int tmp = myvec[i][j-1];
while(tmp != -1){
if(str[j] == str[tmp+j-i]){
myvec[i][j] = tmp;
if(myvec[tmp][tmp+j-i-1] == -1)
cout<<str.substr(i,j-i+1)<<endl;
break;
}else tmp = myvec[tmp][tmp+j-i-1];
}
}
}
int main()
{
getAllSub("ababa");
return 0;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
2025-12-22 16:53
大连理工大学 产品总监
王海:不算mentor但也带过几个实习生,直接观感就是你可以摸鱼可以想早下班,分给你的工作好好完成就行 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
10688次浏览 133人参与
# 你认为工作的意义是什么 #
249236次浏览 1498人参与
# 程序员找工作至少要刷多少题? #
18461次浏览 247人参与
# 为了减少AI幻觉,你注入过哪些设定? #
4616次浏览 149人参与
# 我现在比当时_,你想录用我吗 #
8679次浏览 111人参与
# 机械人避雷的岗位/公司 #
43442次浏览 299人参与
# 一张图晒一下你的AI员工 #
5058次浏览 114人参与
# 论秋招对个人心气的改变 #
10883次浏览 155人参与
# 关于春招/暑期实习,你想知道哪些信息? #
7476次浏览 119人参与
# 刚入职的你踩过哪些坑 #
6853次浏览 127人参与
# AI Coding的使用心得 #
4642次浏览 101人参与
# 晒晒你司的新年福利 #
8443次浏览 105人参与
# 牛客AI体验站 #
6761次浏览 186人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1959次浏览 47人参与
# 柠檬微趣工作体验 #
14777次浏览 83人参与
# 总结:哪家公司面试体验感最差 #
93012次浏览 430人参与
# 程序员能干到多少岁? #
8620次浏览 115人参与
# 你认为小厂实习有用吗? #
118055次浏览 679人参与
# 互联网公司评价 #
485621次浏览 4109人参与
# 应届生进小公司有什么影响吗 #
118287次浏览 1159人参与
