问题
(问题都是来源某牛的题,用matlab编程实现)
给定一个字符串s,问该字符串里有多少个长度大于1的连续子串都是回文?
回文:正序的文本内容与倒序的文本内容相同,比如 aa,aba
输入例子
abbcbb
输出例子
4
例子说明
bb,bbcbb, bcb, bb共四个符合要求
解题思路
文字符串处理问题,又是常见的回文字符串。由题,可以分两步进行:第一步,列举出所有子串(当然也可以不用穷举,用平衡轴对称那种办法) ; 第二步,判断出字串是否为回文字符串。
第一步(给定字符串s,生成长度不等的子串t)的实现代码为:
for i=1:size(s,2) %当前字串的长度为i
for j=1:size(s,2)-i %长度为i的字串下标从j开始
t='';
for k=j:j+i
t=[t,s(k)];
end
disp(t);
end
end
第二步,判断是否为回文
flag=1;
L=size(s,2);
j=L;
for i=1:floor(L/2) %只需比较一半字符串
if s(i)~=s(j)
flag=0;
return;
end
j=j-1;
end
Matlab代码实现
把步骤1、2代码结合起来就是问题的解了
s='abbcbb';
count=0;
%% 1.求子串(穷举法找出子串)
for i=1:size(s,2) %当前字串的长度为i
for j=1:size(s,2)-i %长度为i的字串下标从j开始
t='';
for k=j:j+i
t=[t,s(k)];
end
%% 2.判断字串是否为回文
flag=isPalindrome(t);
if flag==1
disp(t);
count=count+1;
end
end
end
disp(count);
isPalindrome.m()判断是否为回文
function flag=isPalindrome(s)
flag=1;
L=size(s,2);
j=L;
for i=1:floor(L/2) %只需比较一半字符串
if s(i)~=s(j)
flag=0;
return;
end
j=j-1;
end
非穷举
s='abbcbb';
count=0;
for i=1:size(s,2) %遍历整个字符串
k=i-1;
r=i+1;
while( k>=1 && r<=size(s,2) && s(k)==s(r)) %以当前字符为对称轴向左右扩展
count=count+1;
k=k-1;
r=r+1;
end
k=i;
r=i+1;
while(k>=1 && r<=size(s,2) && s(k)==s(r)) %以两个字符的中间为对称轴
count=count+1;
k=k-1;
r=r+1;
end
end
disp(count);
总结
由主串s,生成长度不等的字串t,已经判断一个字符串是否为回文字符串都是字符串类题目的常考知识点,因此对于这两个步骤不但要能写出来,而且还要快速、准确,为其他步骤的进行节省时间。
穷举与非穷举的对比 穷举法运行10w次的运行时间是1.85s,非穷举的运行10w次时间是0.013s,乍一看差距还是有的,究竟是花5分钟写完穷举法开开心心下班还是加班45分钟想出优化算法的方案确实是一个需要权衡的问题…