【专题归纳】字符串之回文

前言

在春招或者秋招的时候,大厂的笔试题对于字符串的考察算是格外的情有独钟,而字符串问题中最为特别的就要数回文了。本文主要记录了笔者在笔试以及平时刷题中遇到的各种回文相关的题目,一方面方便自己后续复习,另一方面也希望能帮助到看这篇文章的各位。本文收录的问题如下:

  • 【华为OJ】字符串运用-密码截取

收集的问题会根据笔者遇到的题目进行不定期的补充。


1.【华为OJ】字符串运用-密码截取

题目描述

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

输入:

ABBA

输出:

4

问题分析:

这道题说了这么多,本质上就是求字符串中最长回文子串的长度。而求最长回文子串的方法基本上可归纳为3种:

  • 暴力求解,穷举该字符串的每一种子串,然后找出最长的回文子串。时间复杂度为   o ( n 3 ) \ o(n^{3})  o(n3)
  • 将字符串中的每个字符和字符之间的空隙当作回文的中心,然后从中心向两边展开寻找回文子串,通过比较得出最长的回文子串。时间复杂度为   o ( n 2 ) \ o(n^{2})  o(n2)
  • 专门用于解决该问题的 Manacher’s Algorithm。时间复杂度为   o ( n ) \ o(n)  o(n)

接下来我们就分别对上面三种方式的Java代码进行实现:

1).暴力求解法:

public class Main {
   

    public static void main(String[] args) {
   
        String s = "acecaace";
        System.out.println(findLongestPalindrome(s));
    }

    private static boolean isPalindrome(String s){
   
        int len = s.length();
        for (int i = 0; i < len; i++){
   
            if (s.charAt(i) != s.charAt(len-1-i)){
   
                return false;
            }
        }
        return true;
    }

    public static int findLongestPalindrome(String s
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值