回文串算法Java实现
2016-03-02 23:34
267 查看
今天看到一个回文串的问题:
网上可能有一些数学技巧的快速解法,但是我这里想利用程序的穷举办法实现。
思路:
1)先判断给定的字符串是否回文串,如果是就不需要构造
2)如果不是回文串,就尝试添加一个字符构造一个新字符串
3)然后再判断新构造的字符串是否回文串
因为构成回文串的字符必定是从原来的字符串抽取一个出来构造的,所以可以让程序去穷举2)的情况。
例如 abc,要构成回文串,构造字符必定是a或b或c, 尝试组合成:
“Aabc”, “aAbc”, “abAc”,“abcA”;
“Babc”, “aBbc”, “abBc”,“abcB”;
“Cabc”, “aCbc”, “abCc”,“abcC”;
另外,如果是回文串,必定成对称分布。
实现程序如下:
如果要加快速度,可以加多一步在splitStrArr中排除重复的字符。
String[] splitStrArr = inputStr.split(“”); //拆分
给定一个字符串,能否通过添加一个字母将其变成“回文串”,“回文串”是指正着和反着读都一样的字符串。如: “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(“”); //拆分
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析