求回文串的子回文串

求回文串的子回文串

分析:

定义函数f(s)为求s中包含的回文串,则f(s)=f(s1)+f(s2)+p(middle),其中middle为字符串s的中间字符的下标,例如字符串abcddcba,则middle=3。

s1为middle左边的子串,s2为middle右边的子串,s1,s2都不含字符s[middle],其中p(middle)为s中包含s[middle]字符的回文字符串。

对于p(middle)的求法,从左到右遍历s的字符,如果找到字符s[i]和s[middle]相等,先判断i和middle值大小,如果i>middle,交换值,然后判断字符串s[i,middle]是否为回文串,如果是,则将其加入集合,并在此字符串基础上扩充,扩充为每次i-1,middle+1,并且保证i=>0和middle<s.length,如果找到新的回文串,则加入,如果遇到s[i]!=s[middle],则结束本次扩充。


java实现:

package palindromestring;


import java.util.ArrayList;


public class PalindromeString {
//storage sub palindrome string
ArrayList<String> subList = null;


public PalindromeString(){
subList = new ArrayList<String>();
}


/**
* Palindrome string
* @param source
*/
public void Palindrome(String source){
if(source==null||source.length()<2){
return;
}
//middle index
int middle=source.length()%2==0?(source.length()/2-1):(source.length()/2);
String leftSubChild = source.substring(0, middle);
String rightSubChild=source.substring(middle+1,source.length());

containMiddleSub(source, middle);//contain s[middle]
Palindrome(leftSubChild);//left subString
Palindrome(rightSubChild);//rightSubString

}

/**
* inspect having contained target
* @param target
* @return
*/
public boolean isContains(String target){
for(String str:subList){
if(str.equals(target))
return true;
}
return false;
}

/**
* sub of contains middle char 
* @param source
* @param middle
*/
public void containMiddleSub(String source,int middle){
for(int i=0;i<source.length();i++){
if(source.charAt(i)==source.charAt(middle)){
int low=i;
int high=middle;
if(low>high){
int temp=low;
low=high;
high=temp;
}
String subP= source.substring(low,high+1);
if(isPalindrome(subP)){
if(!isContains(subP)){
subList.add(subP);

while(low>0&&high<source.length()-1){
low--;
high++;
if(source.charAt(low)==source.charAt(high)){
subP=source.substring(low,high+1);
if(isContains(subP)){
break;
}
else
subList.add(subP);
}
else
break;
}
}
}
}
}
}

/**
* inspect Palindrome
* @return
*/
public boolean isPalindrome(String str){
int low=0;
int high=str.length()-1;
boolean is=true;
while(is&&low<high){
if(str.charAt(low)!=str.charAt(high)){
is=false;
}
low++;
high--;
}

return is;
}

public static void main(String[] args){
String testStr="abcddcbaabcddcba";
PalindromeString ps = new PalindromeString();
ps.Palindrome(testStr);
for(String str:ps.subList){
System.out.println(str);
}
}



}


结果:

abcddcba
a
aa
baab
cbaabc
dcbaabcd
ddcbaabcdd
cddcbaabcddc
bcddcbaabcddcb
abcddcbaabcddcba
d
dd
cddc
bcddcb
b
c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值