关注
先说结论,动态规划,时间复杂度最差为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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你的mentor是什么样的人? #
11493次浏览 91人参与
# 毕业租房也有小确幸 #
140162次浏览 4491人参与
# 快手技术岗信息交流阵地 #
99次浏览 0人参与
# 帮我看看,领导说这话什么意思? #
14400次浏览 87人参与
# 得物app工作体验 #
26855次浏览 60人参与
# 怎么给家人解释你的工作? #
6720次浏览 52人参与
# 平安产险科技校招 #
2597次浏览 0人参与
# 牛友的志愿填报指南 #
33262次浏览 175人参与
# 租房前辈的忠告 #
258980次浏览 7114人参与
# 国企还是互联网,你怎么选? #
167144次浏览 1169人参与
# 求职中的尴尬瞬间 #
1281次浏览 22人参与
# 校招泡的最久的公司是哪家? #
9689次浏览 63人参与
# 小红书求职进展汇总 #
117674次浏览 940人参与
# 求职低谷期你是怎么度过的 #
9632次浏览 190人参与
# 26届秋招公司红黑榜 #
23266次浏览 84人参与
# 从哪些方向判断这个offer值不值得去? #
11667次浏览 149人参与
# 度小满求职进展汇总 #
11758次浏览 64人参与
# 你觉得mentor喜欢什么样的实习生 #
14540次浏览 385人参与
# 薪资爆料 #
197002次浏览 1501人参与
# 牛客树洞,我想对你说 #
3869次浏览 61人参与
# 没有家庭托举的我是怎么找工作的 #
17164次浏览 206人参与
# 还记得你第一次面试吗? #
339502次浏览 3874人参与