关注
先说结论,动态规划,时间复杂度最差为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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 这个offer值得去吗? #
23663次浏览 187人参与
# 上班苦还是上学苦呢? #
345844次浏览 2076人参与
# 在爱玛,骑向未来 #
15221次浏览 337人参与
# 如果春招能重来,我会___ #
24004次浏览 252人参与
# 实习怎么做才有更好的产出 #
50288次浏览 460人参与
# 你会因为行情,降低找工作标准吗? #
36884次浏览 298人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
48269次浏览 521人参与
# 字节开奖 #
153611次浏览 713人参与
# 我的秋招“寄”录 #
476747次浏览 3065人参与
# 面试线索爆料 #
131187次浏览 706人参与
# 提名点击就挂的公司 #
144423次浏览 492人参与
# 刚入职就____,这样正常吗? #
144272次浏览 693人参与
# AI coding的好用工具分享 #
88729次浏览 567人参与
# 字节求职进展汇总 #
1851846次浏览 15437人参与
# 找工作以来,你最看不惯__ #
79620次浏览 594人参与
# 大学四年该怎么过,才不算浪费时间? #
24022次浏览 107人参与
# 硬件人秋招的第一个offer #
129216次浏览 1473人参与
# AI“智障”时刻 #
40556次浏览 195人参与
# 业务面应该做哪些准备 #
128294次浏览 1345人参与
# 双非本科求职如何逆袭 #
1652151次浏览 13099人参与
# 双非应该如何逆袭? #
589350次浏览 6410人参与
# 制造业的秋招小结 #
157517次浏览 2136人参与
