zoukankan      html  css  js  c++  java
  • 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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    微信第三方平台开发之代小程序实现业务
    解决Chrome网页编码显示乱码的问题
    .Net Core 使用 System.Drawing.Common 在CentOS下报错
    CentOS安装nmap端口查看工具
    解决Nginx反向代理不会自动对特殊字符进行编码的问题 如gitblit中的~波浪线
    Centos7最小安装化后安装图形界面
    手把手教您在 Windows Server 2019 上使用 Docker
    windows10下安装docker报错:error during connect
    git删除远程分支
    linux下shell显示git当前分支
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10772275.html
Copyright © 2011-2022 走看看