问题描述:
给定一个待判定的字符串列表,对其中的每个字符串进行判断,计算每个字符所有可能的回文序列数目
做法思想:
这里采取对单个字符串生成得到其全排列的方式,之后对每个排序字符串进行判断,统计结果输出即可
优、缺点:
简单易懂易实现,但是消耗内存较多
下面是具体的实现:
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:给定一个字符串求解所有可能的回文序列
'''
def huiwen(one_str):
'''
输入字符串,判断是否是回文序列,返回布尔值
'''
length=len(one_str)
if length%2==0:
half=length/2
first_str=one_str[:half]
second_str=''.join(list(one_str[half:])[::-1])
if first_str==second_str:
return True
else:
return False
else:
half=(length+1)/2
first_str=one_str[:half-1]
second_str=''.join(list(one_str[half:])[::-1])
if first_str==second_str:
return True
else:
return False
def all_sorts(str_list):
'''
输入字符串列表,输出全排序列表
'''
if len(str_list) == 0 or len(str_list) == 1:
return [str_list]
result = []
for i in str_list:
temp_list = str_list[:] #复制
temp_list.remove(i)
temp = all_sorts(temp_list) #使用递归 生成删掉一个元素的xs的全排列
for one in temp: #对temp中的每一项再进行遍历
one[0:0] = [i] #在index 0 的位置插入之前删去的i
result.append(one)
return result
def judge_is_huiwen(new_list):
'''
输入全排序字符串列表输出可以组成的回文串数量
'''
count=0
for one in new_list:
if huiwen(one):
count+=1
return count
def main_func(one_str_list):
'''
主调用函数,输入为一个待判定字符串列表,输出可以构成的回文序列数目
'''
for one_str in one_str_list:
one_list=list(one_str)
one_result_list=all_sorts(one_list)
one_new_list=[''.join(one) for one in one_result_list]
print '该字符串所有可能构成的回文序列数目为:', judge_is_huiwen(one_new_list)
if __name__=='__main__':
# 单个测试样例
# one_str='12345'
# one_list=list(one_str)
# result_list=all_sorts(one_list)
# new_list=[''.join(one) for one in result_list]
# print '该字符串所有可能构成的回文序列数目为:', judge_is_huiwen(new_list)
one_str_list=['aaabb','abcdef','aaa','adc']
main_func(one_str_list)
结果如下:
该字符串所有可能构成的回文序列数目为: 24
该字符串所有可能构成的回文序列数目为: 0
该字符串所有可能构成的回文序列数目为: 6
该字符串所有可能构成的回文序列数目为: 0