先说结论,动态规划,时间复杂度最差为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; }
点赞 评论

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
牛客网
牛客企业服务