Loading [Contrib]/a11y/accessibility-menu.js
$\newcommand{\O}{\mathrm{O}}$ My Algorithm : kopricky アルゴリズムライブラリ

kopricky アルゴリズムライブラリ

Finding the Longest Palindrome Sequence

コードについての説明

文字列内の最長連続部分回文列を求めるアルゴリズム.

時間計算量: $\O (n^2)$ ($n$ は文字列の長さ)

コード

  1. int LPS(const string& s)
  2. {
  3. int n = (int)s.size();
  4. vector<vector<int> > dp(n,vector<int>(n+1,0));
  5. rep(i,n){
  6. dp[i][i+1] = 1;
  7. }
  8. //iは部分文字列の長さ
  9. for(int i = 2; i <= n; i++){
  10. rep(j,n-i+1){
  11. int k = i + j;
  12. if(s[j] == s[k-1]){
  13. dp[j][k] = dp[j+1][k-1] + 2;
  14. }else{
  15. dp[j][k] = max(dp[j][k-1], dp[j+1][k]);
  16. }
  17. }
  18. }
  19. return dp[0][n];
  20. // 最長部分回文列の出力
  21. // string res;
  22. // int ni = 0, nj = n;
  23. // while(nj-ni > 1){
  24. // if(s[ni] == s[nj-1]){
  25. // res.push_back(s[ni]);
  26. // ni++,nj--;
  27. // }else{
  28. // if(dp[ni][nj] == dp[ni][nj-1]){
  29. // nj--;
  30. // }else{
  31. // ni++;
  32. // }
  33. // }
  34. // }
  35. // if(nj-ni){
  36. // string tmp = res;
  37. // res.push_back(s[ni]);
  38. // reverse(tmp.begin(),tmp.end());
  39. // res += tmp;
  40. // }else{
  41. // string tmp = res;
  42. // reverse(tmp.begin(),tmp.end());
  43. // res += tmp;
  44. // }
  45. }

verify 用の問題

verify していません(verify 問題を知らない)