关注
先说结论,动态规划,时间复杂度最差为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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
04-14 14:42
西北大学 产品经理 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 牛油的搬砖plog #
23337次浏览 104人参与
# 运营每日一题 #
67272次浏览 643人参与
# 一人一个landing小技巧 #
21540次浏览 420人参与
# 找工作的破防时刻 #
23654次浏览 370人参与
# 我在牛爱网找对象 #
177633次浏览 1334人参与
# 为什么那么多公司毁约 #
163024次浏览 1220人参与
# 520告白墙 #
16007次浏览 282人参与
# 实习学不到东西怎么办? #
202979次浏览 2111人参与
# 2023届毁约公司名单 #
190116次浏览 938人参与
# 实习/项目/竞赛奖项,哪个对找工作更重要? #
80057次浏览 1102人参与
# 腾讯音乐求职进展汇总 #
85972次浏览 481人参与
# 25届秋招公司红黑榜 #
259230次浏览 1089人参与
# 面试被问第一学历差时该怎么回答 #
121956次浏览 762人参与
# 电网笔面经互助 #
31396次浏览 317人参与
# 我想象的实习vs现实的实习 #
277268次浏览 2207人参与
# 被同事甩锅了怎么办 #
18885次浏览 94人参与
# 哪些企业的面试体验感最差? #
23878次浏览 233人参与
# 我发现一个规律 #
2534次浏览 26人参与
# 工作中,你有没有遇到非常爱骂人的领导? #
28849次浏览 155人参与
# 拼多多工作体验 #
22343次浏览 156人参与