LeetCode-1759。同種の部分文字列の数を数える[中]-分析とコード(Java)

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、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/113873453