回文串算法Java实现

来源:互联网 发布:qq三国吃白菜数据 编辑:程序博客网 时间:2024/06/05 22:55

今天看到一个回文串的问题:

给定一个字符串,能否通过添加一个字母将其变成“回文串”,“回文串”是指正着和反着读都一样的字符串。如: “aa”, “aba” , ”abcba“等。“abcd”, “abce”就不是。

网上可能有一些数学技巧的快速解法,但是我这里想利用程序的穷举办法实现。

思路:
1)先判断给定的字符串是否回文串,如果是就不需要构造
2)如果不是回文串,就尝试添加一个字符构造一个新字符串
3)然后再判断新构造的字符串是否回文串

因为构成回文串的字符必定是从原来的字符串抽取一个出来构造的,所以可以让程序去穷举2)的情况。
例如 abc,要构成回文串,构造字符必定是a或b或c, 尝试组合成:

“Aabc”, “aAbc”, “abAc”,“abcA”;
“Babc”, “aBbc”, “abBc”,“abcB”;
“Cabc”, “aCbc”, “abCc”,“abcC”;

另外,如果是回文串,必定成对称分布。

实现程序如下:

public class Aglorith{    public static void main(String[] args){        String inputStr =  "abc"; //输入字符串        String[] splitStrArr = inputStr.split(""); //拆分         String result = inputStr;        boolean Successflag = false; //标记成功        //循环每个字符,这些字符是用来构造新字符串        for(int i=0;i<splitStrArr.length;i++)        {            //列举所有可能的添加位置,然后循环构造新字符串            for(int j=0;j<inputStr.length()+1;j++) {                if (!validateStr(result)) {                    result = constructString(splitStrArr[i], inputStr,j);                    continue;                }else{                    System.out.println("Success:" + result);                    Successflag = true;                    return;                }            }        }        System.out.println("Success?: " + Successflag);    }     //检测当前字符串是否回文串    public static boolean validateStr(String inputstr){        if (inputstr == null)            return false;        String[] arrStr = inputstr.split("");        int loop = arrStr.length/2;        int i=0 ,j = 0;        j = arrStr.length;        for(i=0;i<loop;i++){              //判断每个字符是否对称            if(arrStr[i].equals(arrStr[j-i-1])){                 continue;            }            else            {                return false;            }        }        return true;    }   //尝试构造新字符串    public static String constructString(String addchar, String orginStr, int i){        String result;        if(i<0||i>orginStr.length()){            return "false";        }        if(i==0)        {            result = addchar + orginStr;        }else if(i==orginStr.length())        {            result = orginStr+addchar;        }        else        {            result = orginStr.substring(0, i) + addchar + orginStr.substring(i, orginStr.length());        }        return result;    }}

如果要加快速度,可以加多一步在splitStrArr中排除重复的字符。
String[] splitStrArr = inputStr.split(“”); //拆分

0 0