输出字符串的最长回文序列

来源:互联网 发布:魔幻壁纸软件 编辑:程序博客网 时间:2024/06/06 02:23

自己写的一段小代码,感觉思路还算明确,但是写的代码水准不是太高,留给有需要的小伙伴一起学习~附上代码:

import java.util.Scanner;public class TestHuiWen {    public static void main(String[] args) {        String str;        System.out.println("请输入字符串:");        Scanner reader = new Scanner(System.in);        str = reader.next();        reader.close();        forHuiWen(str);    }    /**     * 输出一个字符串的最长回文序列     * @param str     */    private static void forHuiWen(String str) {        String temp = null;        String []s= new String[100];        int max =0,length=0,j=0,flag=0;        for(int i=0;i<str.length();i++){            temp = str.substring(i, str.length());            length = forLonger(temp).length();            if(length!=1){                s[j] = forLonger(temp);                if(length>max){                    max = length;                    flag = j;                }//              System.out.println(forLonger(temp));                j++;            }        }        System.out.print(str+"的最长回文序列的长度为"+max);        System.out.println(",该序列为:"+s[flag]);    }    /**     * 返回一个字符串中以字符串第一个字符为首字符的最长回文     * 例如 输入 abcdcbade,返回 abcdcba     * @param str     * @return     */    private static String forLonger(String str) {        if(isHuiWen(str)){            return str;        }else{            return forLonger(str.substring(0, str.length()-1));        }    }    /**     * 创建一个方法,判断一个字符串是否是回文     * @param str     * @return     */    private static boolean isHuiWen(String str) {        char[] ch = str.toCharArray();        boolean flag = true;        int length = ch.length;        for(int i=0;i<ch.length/2;i++){            if(ch[i]!=ch[length-1]){                flag = false;            }            length--;        }        return flag;        }   }

另外附上某一大神的 经典算法——最长回文子序列
是C语言编写的,留给以后看。
原文http://blog.csdn.net/geekmanong/article/details/51056375#

#include<iostream>  #include<algorithm>  using namespace std;  //动态规划求解最长回文子序列,时间复杂度为O(n^2)  int lpsDp(char *str, int n)  {      int dp[10][10], tmp;      memset(dp, 0, sizeof(dp));      for (int i = 0; i < n; ++i)  dp[i][i] = 1;      for (int i = 1; i < n; ++i)      {          tmp = 0;          //考虑所有连续的长度为i+1的子串,str[j....j+i]          for (int j = 0; j + i < n; j++)          {              //如果首尾相同              if (str[j] == str[j + i])                  tmp = dp[j + 1][j + i - 1] + 2;              //如果首尾不同              else                   tmp = max(dp[j + 1][j + i], dp[j][j + i - 1]);              dp[j][j + i] = tmp;          }      }      return dp[0][n - 1]; //返回字符串str[0...n-1]的最长回文子序列长度  }  int main()  {      char str[10] = "cabbeaf";      int res = lpsDp(str, strlen(str));      cout << res << endl;      getchar();      return 0;  } 
0 0
原创粉丝点击