(1条消息) 必须掌握的超高频旋转算法题目!

今天是小浩算法 “365刷题计划” 第103天。分享的这道题虽然很简单,但是在笔试或者面试当中,出现的频率却非常高。

01

PART

旋转字符串

经典常考类算法题目。

第796题:给定两个字符串, A 和 B。A 的旋转操作就是将 A 最左边的字符移动到最右边。例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

示例 1:

输入: A = 'abcde', B = 'cdeab'

输出: true

示例 2:

输入: A = 'abcde', B = 'abced'

输出: false

注意:A 和 B 长度不超过 100。

题意还是很容易理解的,说白了就是每次把前面的元素放到最后面:

02

PART

题解分析

这道题目看起来简单,但其实很容易出错。

这道题目最容易想到的解法,其实就是跟着题意来。每次将旋转后的A和目标串对比:

//javaclass Solution {    public boolean rotateString(String A, String B) {        if (A.equals("") && B.equals("")) {            return true;        }        int len = A.length();        for (int i = 0; i < len; i++) {            String first = A.substring(0, 1);            String last = A.substring(1, len);            A = last + first;            if (A.equals(B)) {                return true;            }        }        return false;    }}

但是代码其实并不优雅,我们继续观察一下这个字符串:

无论它怎样旋转,最终的 A + A 包含了所有可以通过旋转操作从 A 得到的字符串:

那我们是不是只需要判断 B 是否为 A + A 的子串就可以了:

//javaclass Solution {    public boolean rotateString(String A, String B) {        return A.length() == B.length() && (A + A).contains(B);    }}

一般面试写的话,基本就是到这个程度。但是大概率面试官这时还会问你一个问题:如何继续进行优化?

注意我们上面问题,其实已经转化为了:判断 B 是否为 A + A 的子串。那我们就可以引申答出 KMP,SUNDAY,BF 等字符串匹配策略。(当然,这里其实 SUNDAY 并不是特别适合)

然后就是用相应的匹配策略,来实现转化后的问题。

这里附上一份 KMP 解题代码:

1//java2class Solution {3    public boolean rotateString(String A, String B) {4        int N = A.length();5        if (N != B.length()) return false;6        if (N == 0) return true;78        int[] shifts = new int[N+1];9        Arrays.fill(shifts, 1);10        int left = -1;11        for (int right = 0; right < N; ++right) {12            while (left >= 0 && (B.charAt(left) != B.charAt(right)))13                left -= shifts[left];14            shifts[right + 1] = right - left++;15        }1617        //Find match of B in A+A18        int matchLen = 0;19        for (char c: (A+A).toCharArray()) {20            while (matchLen >= 0 && B.charAt(matchLen) != c)21                matchLen -= shifts[matchLen];22            if (++matchLen == N) return true;23        }24        return false;25    }26}

这个有兴趣可以看看,代码是 leetcode 官方的。

03

PART

算法小知识

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。

(0)

相关推荐

  • 字符串匹配算法详解

    希望看到文章的你们,能够在今年的研究生考试中超常发挥. 愿你们都能考上自己心仪的学校,为你们的备考生涯划上一个完美的句号.做为你们的师兄有几句话想对你们说,希望这些话能对你们有一些帮助. 马上就要考试 ...

  • ​LeetCode刷题实战386:字典序排数

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战242:有效的字母异位词

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 【原创】史上最透彻的KMP算法讲解

    【原创】史上最透彻的KMP算法讲解

  • (9条消息) matlab画正态分布图简单算法

    matlab中的常用概率分布函数. 引用他人的整理成果,总结的很好. 用matlab画正态分布图的代码: clear all: x=-4:0.1:4; y=normpdf(x,0,1); figure ...

  • (1条消息) 竟然可以这样旋转数组?

    (1条消息) 竟然可以这样旋转数组?

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • (35条消息) 家用宽带网络与服务器使用的网络有什么不同?

    很多人都知道,服务器的网络跟家用网络有很多区别.其中有很多技术大牛,都是使用家里的宽带做很多别人使用公网服务器才能完成的服务. 但是对于普通人来讲,似乎都觉得没什么区别,本文就此简单做一下区分: 固定 ...

  • 怎么设置微信公众号添加关注后自动回复多条消息

    怎么设置微信公众号添加关注后自动回复多条消息

  • (40条消息) 5G网络(接入网+承载网+核心网)

    前一段时间自己一直在做某市的5G试点项目,对5G的无线接入网相关技术有了更深入的认识.因此,希望通过无线接入网为线索(行话叫锚点),帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主, ...

  • (7条消息) 国家信息化体系六要素

    历史的温度:寻找历史背面的故事.热血和真性情作者:张玮出版社:中信出版集团股份有限公司好评:100% 销售量:0 ¥34.3 历史的温度2:细节里的故事.彷徨和信念作者:张玮出版社:中信出版集团股份有 ...

  • (7条消息) QStringLiteral

    QStringLieral是Qt5中新引入的一个用来从"字符串常量"创建QString对象的宏(字符串常量指在源码中由双引号包含的字符串).在这篇博客我讲解释它的的内部实现和工作原 ...