关注
先说结论,动态规划,时间复杂度最差为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;
}
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 实习生的蛐蛐区 #
47182次浏览 362人参与
# 夸夸我的求职搭子 #
199880次浏览 1917人参与
# 你认为小厂实习有用吗? #
17557次浏览 217人参与
# 硬件应届生薪资是否普遍偏低? #
75122次浏览 518人参与
# 应届生,你找到工作了吗 #
19567次浏览 144人参与
# 三一重工求职进展汇总 #
13072次浏览 60人参与
# 材料人,你们签了哪个公司 #
7233次浏览 17人参与
# 说说你知道的学历厂 #
33373次浏览 194人参与
# 计算机有哪些岗位值得去? #
15164次浏览 142人参与
# 下班后的时间你怎么安排 #
9120次浏览 131人参与
# 你找工作的时候用AI吗? #
16781次浏览 217人参与
# 面试尴尬现场 #
28530次浏览 193人参与
# 在职场上,你最讨厌什么样的同事 #
14963次浏览 151人参与
# 哪一瞬间觉得自己长大了 #
8320次浏览 183人参与
# 中核求职进展汇总 #
20567次浏览 152人参与
# 社会教会你的第一课 #
32759次浏览 424人参与
# 电网笔面经互助 #
36565次浏览 354人参与
# lastday知无不言 #
57533次浏览 469人参与
# 简历当中有水分算不算造假? #
26208次浏览 385人参与
# 如何拒绝/反向PUA #
68946次浏览 356人参与