leetcode (Repeated Substring Pattern)
阿新 • • 發佈:2018-12-23
Title:Repeated Substring Pattern 459
Difficulty:Easy
原題leetcode地址:https://leetcode.com/problems/repeated-substring-pattern/
1. 將字串首尾相加,然後將新的字串的第一位和最後一位去掉,判斷原始的字串是不是新的字串的子串
時間複雜度:O(1),沒有迴圈語句,但是呼叫了split方法。
空間複雜度:O(1),沒有申請額外空間。
/** * 將字串首尾相加,然後將新的字串的第一位和最後一位去掉,判斷原始的字串是不是新的字串的子串 * 通過split方法切分,如果切分後的長度為1,則為false,否則為true * @param s * @return */ public static boolean repeatedSubstringPattern(String s) { if (s == null || s.length() < 2) { return false; } String newStr = s + s; newStr = newStr.substring(1, newStr.length() - 1); System.out.println(newStr); String str[] = newStr.split(s); if (str.length == 1) { return false; } else { return true; } }
1. 一個字串是由某個子字串組成的,那麼這個字串的長度肯定是這個子字串長度的倍數,也就是說子字串長度是這個字串長度的約數
時間複雜度:O(n^2),巢狀迴圈,仔細分析也沒有n^2。
空間複雜度:O(n),申請額外空間List,其實沒有總長度n。
/** * 一個字串是由某個子字串組成的,那麼這個字串的長度肯定是這個子字串長度的倍數,也就是說子字串長度是這個字串長度的約數。 * 某個子字串肯定是這個字串的字首 * @param s * @return */ public static boolean repeatedSubstringPattern1(String s) { if (s == null || s.length() < 2) { return false; } int len = s.length(); List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i < len / 2 + 1; i++) { if (len % i == 0) { list.add(i); } } for (int i : list) { String subStr = s.substring(0, i); boolean res = true; for (int j = 0; j < len / i; j++) { if (!subStr.equals(s.substring(j * i, (j + 1) * i))) { res = false; break; } else { continue; } } if (res) { return true; } else { continue; } } return false; }