LeetCode · 毎日の質問 · 1177. 回文文字列検出の構築 · プレフィックス合計

著者: Xiao Xun
リンク: https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by- n3ps/
出典: LeetCode の著作権は
作者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。

トピック

 

一連の考え

タイトル -> 文字列を指定して、その中の任意の位置 LR を選択します。任意の文字を再配置し、任意の K 文字を置き換えることができます。その結果、LR 部分文字列は回文文字列になります。要件を満たしていれば TRUE になります。要件を満たしていない場合は、TRUE になります。それは偽になります。

回文文字列に変換する必要があります。形状が abccba の場合は回文文字列であり、同じ文字が偶数個、または前者を基準に 1 文字だけが奇数個出現するという特徴があります。

質問の意味は、特定の文字ではなく、要件が満たされるかどうかのみを考慮しています。次に、指定された文字列を文字の出現列に変換し、部分文字列が回文に変換できるかどうかを判断します -> 現在の位置の文字の出現数が上記の要件を満たしているかどうかを判断します

では、上記の質問の意味の要件に変換するにはどうすればよいでしょうか? 部分文字列を指定すると、次のようになります。

  • 同じ文字の出現数が偶数の場合、この文字を変更する必要はありません。
  • 同じ文字の出現回数が奇数の場合:
    • 文字の出現回数は奇数のみなので、修飾の数を使用する必要はありません。
    • 複数の文字が奇数回出現する場合は、出現回数 / 2 変更回数を使用して、冗長な文字を偶数出現に変換する必要があります。

各位置文字の出現数をカウントするにはどうすればよいですか?

  • 配列を使用して、各部分文字列内の文字の出現数を記録します。
  • 文字数は 26 文字しかないので、int 型のビットを使用して出現回数を記録することができ、0 は偶数回、1 は奇数回を意味します。
  • プレフィックスの合計を使用でき、任意の位置での左右の部分文字列の状態の差によって現在の状態を取得できます。

コードコメントは非常に詳細です

コード


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

bool* canMakePaliQueries(char * s, int** queries, int queriesSize, int* queriesColSize, int* returnSize) {
    int n = strlen(s);
    int* count = (int*)malloc((n + 1) * sizeof(int));//二进制代替数组
    memset(count, 0, (n + 1) * sizeof(int));//初始化
    for (int i = 0; i < n; i++) {//前缀和枚举
        // ^ 为不带进位的加法
        count[i + 1] = count[i] ^ (1 << (s[i] - 'a'));//记录整体状态
    }
    bool* res = (bool*)malloc(queriesSize * sizeof(bool));//返回值数组
    for (int i = 0; i < queriesSize; i++) {//枚举子串
        int l = queries[i][0], r = queries[i][1], k = queries[i][2];
        //根据上述表示,大于13则可以能满足转换要求
        //if (k >= 13) {res[i] = true; continue;}
        // 由于没有负值, 那么 0 - 1 等价于 0 + 1
        int bits = 0, x = count[r + 1] ^ count[l];//相差得出当前状态
        while (x > 0) {//求当奇数出现次数
            x &= x - 1;
            bits++;
        }
        res[i] = bits / 2 <= k;//保存有效值
    }
    *returnSize = queriesSize;
    free(count);
    return res;
}



作者:小迅
链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

おすすめ

転載: blog.csdn.net/m0_64560763/article/details/131224666