算法第八天|字符串篇

右旋字符串

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        String str = scanner.next();
        String value = getStr(num, str);
        System.out.println(value);
    }

    private static String getStr(int num, String str) {
        if (num >= str.length()) {
            return str;
        }

        int left = str.length() - num;

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < left; i++) {
            stringBuilder.append(str.charAt(i));
        }
        StringBuilder newStringBuilder = new StringBuilder();
        for (int i = left; i < str.length(); i++) {
            newStringBuilder.append(str.charAt(i));
        }
        newStringBuilder.append(stringBuilder);

        return new String(newStringBuilder);
    }
}

28. 找出字符串中第一個匹配項的下標

 public int strStr(String haystack, String needle) {
        int i = haystack.indexOf(needle);
        return i;
    }

    public int strStr2(String haystack, String needle) {
        if (haystack.length() < needle.length()) {
            return -1;
        }

        for (int i = 0; i <= haystack.length() - needle.length(); i++) {
            int x = 0;
            int tempI = i;
            while (x < needle.length() && haystack.charAt(tempI) == needle.charAt(x)) {
                tempI++;
                x++;
            }
            if (x == needle.length()) {
                return i;
            }
        }
        return -1;
    }

自己的算法復雜度是O(m*n),應該使用KMP算法求解,不過今天時間緊,明天加上。

  1. 重復的子字符串
  public static boolean repeatedSubstringPattern(String s) {

        StringBuilder stringBuilder = new StringBuilder();
        StringBuilder stringBuilder2 = new StringBuilder(s.length());
        for (int i = 0; i < s.length() - 1; i++) { // 因為是字串,所以減一
            stringBuilder.append(s.charAt(i));
            if (s.length() % stringBuilder.length() == 0) { // 要求字串重復M倍組成s,那么余數(shù)必然等于0
                while (stringBuilder2.length() < s.length()) {
                    stringBuilder2.append(stringBuilder);
                }
                if (new String(stringBuilder2).equals(s)) {
                    return true;
                }
                stringBuilder2 = new StringBuilder(s.length());
            }
        }
        return false;
    }

肯定有簡化的方法,這樣的時間復雜度有點高,O(nlogn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容