LeetCode-1759。同種の部分文字列の数を数える[同種の部分文字列の数を数える] [中]-分析とコード[Java]
1.トピック
文字列sを指定し、s内の同型部分文字列の数を返します。答えは大きいかもしれないので、10 ^ 9 +7の余りを取って結果を返すだけです。
同形文字列の定義は次のとおりです。文字列内のすべての文字が同じである場合、その文字列は同形文字列です。
部分文字列は、文字列内の文字の連続シーケンスです。
例1:
输入:s = "abbcccaa"
输出:13
解释:同构子字符串如下所列:
"a" 出现 3 次。
"aa" 出现 1 次。
"b" 出现 2 次。
"bb" 出现 1 次。
"c" 出现 3 次。
"cc" 出现 2 次。
"ccc" 出现 1 次。
3 + 1 + 2 + 1 + 3 + 2 + 1 = 13
例2:
输入:s = "xy"
输出:2
解释:同构子字符串是 "x" 和 "y" 。
例3:
输入:s = "zzzzz"
输出:15
促す:
- 1 <= s.length <= 105
- sは小文字の文字列で構成されます
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/count-number-of-homogenous-substrings
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2、分析とコード
1.直接計算
(1)考える
長さがlの同じ文字の文字列の場合、同形部分文字列の数は1 + 2 +…+ l = l *(l + 1)/ 2であり、直接計算するだけです。
計算結果がintの範囲を超える場合がありますので、型変換にご注意ください。
(2)コード
class Solution {
public int countHomogenous(String s) {
char[] c = s.toCharArray();
int n = c.length, m = 1000000007, i = 0, ans = 0;
while (i < n) {
int len = 1;
while (i + len < n && c[i + len] == c[i])
len++;
ans += ((len * (len + 1L)) % m) >> 1;
i += len;
}
return ans;
}
}
(3)結果
実行時間:9ミリ秒、
すべてのJava送信でユーザーの100.00%を上回っています。メモリ消費量:39 MB、すべてのJava送信でユーザーの100.00%を上回っています。
3、その他
何もありません。