先梳理一下简单的一些回文算法的邀请,一般会有四种需求,
1.判断字符串是否是回文串
2.取出字符串中最长的回文串或者回文串长度
3.将字符串分割为一个回文串
4.列出字符串中所有回文串的可能
我们一个个来(这里就用php来实现,主要是提供思路)
一 字符串是否是回文串
这个其实很简单,只需要把字符串翻转对比一下是否相等就能判断了
实现:
function partition($s) {
$s = strval($s);
// 是不是回文
return ($s === strrev($s));
}
二 取出字符串中最长的回文串或者回文串长度
这里的要求是最长回文,但是我们不知道哪个不知道哪个串是最长的,这时候就要把所有的回文串拎出来比较了,这里我们采用循环遍历比较的方法
实现:
function zc($s){
$s = strval($s);
$len = strlen($s);
$tmplen = 0;
$str = '';
// 根据翻转字符串来判断是否是回文
for($i=0;$i<$len;$i++){
for($j=0;$j<$len;$j++){
$tmp = substr($s, $i, $j);
// 是不是回文
if((strlen($tmp) > 1) && ($tmp == strrev($tmp)) && (strlen($tmp) > $tmplen)){
// 回文
// echo $tmp.'<br/>';
$tmplen = strlen($tmp);
$str = $tmp;
}
}
}
return $str;
}
很简单 两个for循环比较就好了
三 将字符串分割为多个回文串
这里要求只分割为一个就好了,当然全部且为零散的一个也算是一个多个回文串,不过我们一般不这样做,因为没有意义,这里我们的思路就是取到一个回文串后将剩下的字符串单独进行分割,然后统一接收
实现:
private static $_hw=[];
private function partition($s) {
$s = strval($s);
// 是不是回文 return ($s === strrev($s));
$len = strlen($s);
for($i=0;$i<$len;$i++){
// 是不是回文
$tmp = substr($s,0,$len-$i);
if(((strlen($tmp) >1) && $tmp === strrev($tmp)) || (strlen($tmp) == 1)){
self::$_hw[] = $tmp;
$str = substr($s,$len-$i,$len);
$this->partition($str);
// 这个break很重要,他保证了所有回文字符串只赋值了一次
break;
}
}
return self::$_hw;
}
四 将字符串分割为回文串的所有可能都列出来
同一个字符串组成的回文串一般都不会只有一种,有时候需要我们列出所有的回文串的可能
实现:
function partitions($s, &$arrRet, &$arrTmp) {
$s = strval($s);
$len = strlen($s);
if ($len < 1) {
$arrRet[] = $arrTmp;
}
//搭建动态规划,获取最小分割次数
for ($i = 0; $i < $len; $i ++) {
//获取从0-i是否是回文串
$subStr = substr($s, 0, $i + 1);
$revSubStr = strrev($subStr);
if ($subStr === $revSubStr) {
$leftStr = substr($s, $i + 1, $len - $i + 1);
array_push($arrTmp, $subStr);//用来输出的
$this->partitions($leftStr, $arrRet, $arrTmp);
array_pop($arrTmp);//用来输出的
// break;
}
}
}
这里补一下java的写法,思路都一样,仅供参考
import java.util.*;
public class HelloWorld {
public static void main(String []args) {
String b = "12213";
ArrayList<ArrayList<String>>arr=new ArrayList<ArrayList<String>>();
ArrayList<String> list=new ArrayList<String>();
all_hw(b,arr,list);
System.out.println(arr);
}
// 判断是否是回文
public static boolean is_hw(String str) {
String c = new StringBuilder(str).reverse().toString();
return str.equals(c);
}
// 最长回文
public static Integer max_hw(String str) {
// 暴力法
Integer max = 1;
for(int i=0;i<str.length();i++){
for(int j=i+2;j<str.length();j++){
String c = str.substring(i,j);
if(is_hw(c) && c.length()>max){
max = c.length();
System.out.println(c);
}
}
}
return max;
}
// 所有回文串数组
public static void all_hw(String str,ArrayList<ArrayList<String>> arr,ArrayList<String> list) {
if(str.length() < 1){
arr.add(new ArrayList<String>(list));
}
for(int i=0;i<str.length();i++){
String c = str.substring(0,i+1);
if(is_hw(c)){
// 是回文
list.add(c);
all_hw(str.substring(i+1),arr,list);
list.remove(list.size()-1);
}
}
}
}