您的位置:首页 > 编程语言 > Java开发

回文串算法Java实现

2016-03-02 23:34 267 查看
今天看到一个回文串的问题:

给定一个字符串,能否通过添加一个字母将其变成“回文串”,“回文串”是指正着和反着读都一样的字符串。如: “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(“”); //拆分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法