LeetCode算法题-Rotate String(Java实现)

这是悦乐书的第317次更新,第338篇原创

在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,《终身成长》《禅与摩托车维修艺术》,值得好好阅读和反复阅读。

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是796)。给定两个字符串A和B,在A上进行移位操作,规则是将A最左边的字符移动到最右边去。例如,如果A =‘abcde‘,那么在A上移位一次后,它将是‘bcdea‘。当且仅当A在A上移位一定次数后可以变为B时返回True。例如:

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

输出:true

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

输出:false

注意:A和B的长度最多为100。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

暴力解法。

特殊情况:如果A本身就和B相等,直接返回true,不需要对A进行移位。

正常情况:每次对A进行移位一次后得到新的字符串,判断是否和B相等,使用一个辅助方法来完成移位操作。先将A转为字符数组arr,然后创建一个新的字符数组arr2,两字符数组长度一致,遍历arr(从第二个元素开始遍历)中的元素,添加进arr2中去(从第一位开添加),遍历结束后,将arr的第一位元素赋值给arr2的最后一位元素,返回以arr2为基础创建的新字符串,判断是否和B相等。

public boolean rotateString(String A, String B) {
    if (A.equals(B)) {
        return true;
    }
    int n = A.length();
    for (int i=0; i<n; i++) {
        A = rotate(A);
        if (A.equals(B)) {
            return true;
        }
    }
    return false;
}

/**
 * 对A进行移位,将字符串第一个字符放到最后去
 * @param A
 * @return
 */
public String rotate(String A) {
    int n = A.length();
    char[] arr = A.toCharArray();
    char[] arr2 = new char[n];
    int index = 0;
    for (int i=1; i<n; i++) {
        arr2[index++] = arr[i];
    }
    arr2[index] = arr[0];
    return new String(arr2);
}

03 第二种解法

也可以使用字符串截取的方式来解题。

public boolean rotateString2(String A, String B) {
    if (A.equals(B)) {
        return true;
    }
    int n = A.length();
    for (int i=0; i<n; i++) {
        A = A.substring(1, n) + A.substring(0, 1);
        if (A.equals(B)) {
            return true;
        }
    }
    return false;
}

04 第三种解法

还可以一行代码搞定。思路是子字符串查找,如果B真的可以通过A移位几次后得到,那么在连续两个A组成的字符串中,肯定会存在一个子串等于B。以题目的示例1为例子,字符串"abcdeabcde"中存在一个子串"cdeab"。

public boolean rotateString3(String A, String B) {
    return A.equals(B) || (A.length() == B.length() && (A+A).indexOf(B) >= 0);
}

05 第四种解法

还可以通过KMP算法来解,此解法来自于官方。传送门:https://leetcode.com/problems/rotate-string/solution/

public boolean rotateString(String A, String B) {
    int N = A.length();
    if (N != B.length()) return false;
    if (N == 0) return true;

    //Compute shift table
    int[] shifts = new int[N+1];
    Arrays.fill(shifts, 1);
    int left = -1;
    for (int right = 0; right < N; ++right) {
        while (left >= 0 && (B.charAt(left) != B.charAt(right)))
            left -= shifts[left];
        shifts[right + 1] = right - left++;
    }

    //Find match of B in A+A
    int matchLen = 0;
    for (char c: (A+A).toCharArray()) {
        while (matchLen >= 0 && B.charAt(matchLen) != c)
            matchLen -= shifts[matchLen];
        if (++matchLen == N) return true;
    }
    return false;
}

06 小结

算法专题目前已日更超过五个月,算法题文章186+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

原文地址:https://www.cnblogs.com/xiaochuan94/p/10772275.html

时间: 2024-08-28 21:08:54

LeetCode算法题-Rotate String(Java实现)的相关文章

LeetCode算法题-Repeated String Match(Java实现)

这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是它的子字符串. 如果没有这样的解决方案,返回-1.例如: 输入:A ="abcd",B ="cdabcdab". 输出:3 说明:因为重复A三次("abcdabcdabcd"),B是它的子串; 和B不是A重复两次的子串("abcdabcd&

LeetCode算法题-Sqrt(Java实现)

这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分.例如: 输入:4 输出:2 输入:8 输出:2 说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试.

Kotlin实现LeetCode算法题之String to Integer (atoi)

题目String to Integer (atoi)(难度Medium) 大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理. 方案1 1 class Solution { 2 fun myAtoi(str: String): Int { 3 val maxInt = "2147483647" 4 val maxIntS = "+2147483647" 5 val minIntS = "-21474836

LeetCode Algorithms Questions List (LeetCode 算法题列表)- Java Solutions

因为在开始写这个博客之前,已经刷了100题了,所以现在还是有很多题目没有加进来,为了方便查找哪些没加进来,先列一个表可以比较清楚的查看,也方便给大家查找.如果有哪些题目的链接有错误,请大家留言和谅解,链多了会眼花.  # Title Acceptance Difficulty  617  Merge Two Binary  69.9%  Easy  606  Construct String from Binary Tree  52.0%  Easy  599  Minimum Index Su

LeetCode算法题-Find All Anagrams in a String(Java实现)

这是悦乐书的第228次更新,第240篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第95题(顺位题号是438).给定一个字符串s和一个非空字符串p,找到s中p的字谜的所有起始索引.字符串仅由小写英文字母组成,字符串s和p的长度不会大于20,100.输出顺序无关紧要.例如: 输入:s:"cbaebabacd" p:"abc" 输出:[0,6] 说明: 起始索引等于0的子字符串是"cba",它是"abc&quo

LeetCode算法题-Number of Lines To Write String(Java实现)

这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为100个单位,如果写一个字母会导致该行的宽度超过100个单位,则会写入下一行.给出一个数组宽度,一个数组,其中widths[0]是'a'的宽度,widths[1]是'b'的宽度,widths[25]是'z'的宽度. 现在回答两个问题:S中至少有一个字符有多少行,最后一行使用的宽度是多少?将答案作为长

LeetCode算法题-Merge Sorted Array(Java实现)

这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中的元素合并到nums1中,并且作为一个排序的数组.在nums1和nums2中初始化的元素个数分别为m和n.假设nums1有足够的空间(大于或等于m + n)来保存nums2中的其他元素.例如: 输入:nums1 = [1,2,3,0,0,0],m = 3,nums2 = [2,5,6],n = 3

LeetCode算法题-Reverse Bits(Java实现)

这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190).给定32位无符号整数,求它的反转位.例如: 输入:43261596 输出:964176192 说明:43261596以二进制表示为00000010100101000001111010011100, 964176192以二进制表示为00111001011110000010100101000000. 本次解题使用的开发工具是eclipse,jdk使用的版本是1

LeetCode算法题-Number of 1 Bits(Java实现)

这是悦乐书的第186次更新,第188篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第45题(顺位题号是191).编写一个带无符号整数的函数,并返回它所具有的"1"位数.例如: 输入:11 输出:3 说明:整数11具有二进制表示00000000000000000000000000001011 输入:128 输出:1 说明:整数128具有二进制表示00000000000000000000000010000000 本次解题使用的开发工具是eclipse,jdk使