Matlab编程练习6(字符串3)

问题

(问题都是来源某牛的题,用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分钟想出优化算法的方案确实是一个需要权衡的问题…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值