[LeetCode] 459. Repeated Substring Pattern

Given a string s, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.

Example 1:

Input: s = "abab"
Output: true
Explanation: It is the substring "ab" twice.

Example 2:

Input: s = "aba"
Output: false

Example 3:

Input: s = "abcabcabcabc"
Output: true
Explanation: It is the substring "abc" four times or the substring "abcabc" twice.

Constraints:

  • 1 <= s.length <= 104
  • s consists of lowercase English letters.

重复的子字符串。

题意很好理解,给一个字符串,请问这个字符串是否是一个子串拼接成的。这个题的思想不涉及算法。既然是判断这个字符串是否是由一个较小的子串拼接而成的,如果 input 字符串的长度小于 2,则一定是错的。接着如何找子串呢?首先,这个子串的长度应该是介于1 - s.length() / 2之间,然后需要用 substring 一点点去截取一个 temp string,判断这个 temp string 是否能整除字符串的总长,如果不是,则这个 temp string 就不是一个符合题意的子串。如果是,则试着用这个 temp string 拼接 M 次,看看最后拼接的结果是否和 input 字符相同。

时间O(n^2)

空间O(n)

Java实现

 1 class Solution {
 2     public boolean repeatedSubstringPattern(String s) {
 3         // corner case
 4         if (s.length() < 2) {
 5             return false;
 6         }
 7 
 8         // normal case
 9         int len = s.length();
10         for (int i = len / 2; i >= 1; i--) {
11             if (len % i == 0) {
12                 // 有m个长度为i的substring
13                 int m = len / i;
14                 String sub = s.substring(0, i);
15                 StringBuilder sb = new StringBuilder();
16                 // 用m个substring i拼成一个长的string 再和s比较
17                 for (int j = 0; j < m; j++) {
18                     sb.append(sub);
19                 }
20                 if (sb.toString().equals(s)) {
21                     return true;
22                 }
23             }
24         }
25         return false;
26     }
27 }

 

JavaScript实现

 1 /**
 2  * @param {string} s
 3  * @return {boolean}
 4  */
 5 var repeatedSubstringPattern = function (s) {
 6     // corner case
 7     if (s.length < 2) {
 8         return false;
 9     }
10 
11     // normal case
12     let len = s.length;
13     for (let i = Math.floor(len / 2); i >= 1; i--) {
14         if (len % i == 0) {
15             let temp = '';
16             let m = Math.floor(len / i);
17             for (let j = 0; j < m; j++) {
18                 temp += s.substring(0, i);
19             }
20             if (temp === s) {
21                 return true;
22             }
23         }
24     }
25     return false;
26 };

 

相关题目

459. Repeated Substring Pattern

686. Repeated String Match

LeetCode 题目总结

posted @ 2020-08-24 06:25  CNoodle  阅读(448)  评论(0编辑  收藏  举报