关注
先说结论,动态规划,时间复杂度最差为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年终总结 #
124056次浏览 2082人参与
# 实习简历求拷打 #
16828次浏览 194人参与
# 作业帮求职进展汇总 #
84057次浏览 554人参与
# 秋招被挂春招仍然能投的公司 #
7885次浏览 108人参与
# 实习要如何选择和准备? #
128583次浏览 1486人参与
# 外包能不能当跳板? #
54324次浏览 256人参与
# 诺瓦星云求职进展汇总 #
233573次浏览 1736人参与
# mt对你说过最有启发的一句话 #
39168次浏览 454人参与
# 公司情报交流地 #
126735次浏览 1227人参与
# 为了找工作你花了哪些钱? #
74911次浏览 361人参与
# 你觉得机械有必要实习吗 #
69863次浏览 485人参与
# 投格力的你,拿到offer了吗? #
153460次浏览 822人参与
# 一起聊美团 #
307742次浏览 1767人参与
# 什么是优秀的实习经历 #
9439次浏览 226人参与
# 摸鱼被leader发现了怎么办 #
103994次浏览 659人参与
# 京东开奖 #
632117次浏览 3180人参与
# 秋招特别不鸣谢 #
16713次浏览 186人参与
# 考研失败就一定是坏事吗? #
202684次浏览 1389人参与
# 选实习,你更看重哪方面? #
15384次浏览 230人参与
# 安克创新求职进展汇总 #
62492次浏览 541人参与
