关注
先说结论,动态规划,时间复杂度最差为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;
}
查看原帖
点赞 评论
相关推荐
11-19 18:45
西安邮电大学 采编 点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
275075次浏览 2356人参与
# 如果实习可以转正,你会不会放弃秋招 #
205698次浏览 2803人参与
# 北方华创开奖 #
24283次浏览 262人参与
# 地方国企笔面经互助 #
3154次浏览 7人参与
# 学历or实习经历,哪个更重要 #
46520次浏览 362人参与
# 选完offer后,你后悔学本专业吗 #
15979次浏览 120人参与
# 如何一边实习一边秋招 #
988689次浏览 12620人参与
# 数据人的面试交流地 #
436040次浏览 7810人参与
# 0offer是寒冬太冷还是我太菜 #
891540次浏览 7956人参与
# 软开人,秋招你打算投哪些公司呢 #
41175次浏览 532人参与
# 得物求职进展汇总 #
64548次浏览 671人参与
# 你觉得专业和学校哪个对薪资影响最大 #
28772次浏览 215人参与
# 你最想要的公司福利是? #
43052次浏览 157人参与
# 查收我的offer竞争力报告 #
20860次浏览 262人参与
# 没有实习经历,还有机会进大厂吗 #
808409次浏览 13872人参与
# 来聊聊机械薪资天花板是哪家 #
67120次浏览 453人参与
# 当你面对裁员会如何? #
26422次浏览 154人参与
# 应届生被毁约被毁意向了怎么办 #
28718次浏览 244人参与
# 一觉醒来,我觉醒了超级打工人系统 #
3513次浏览 36人参与
# 面试体验感最好的是哪家? #
84052次浏览 821人参与
# 机械应届生薪资要多少才合适? #
12622次浏览 61人参与