24/12/20随笔:记录一下每日力扣看到的modern c++

3138. 同位字符串连接的最小长度

给你一个字符串 s ,它由某个字符串 t 和若干 t同位字符串 连接而成。

请你返回字符串 t最小 可能长度。

同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。

示例 1:

输入:s = "abba"

输出:2

解释:

一个可能的字符串 t"ba"

示例 2:

输入:s = "cdef"

输出:4

解释:

一个可能的字符串 t"cdef" ,注意 t 可能等于 s

提示:

  • 1 <= s.length <= 105
  • s 只包含小写英文字母。

我的解法:

class Solution {
public:
    string cut1, cut2, gs;
    int len;
    bool check(int i){
        int now[26] = {0}, cnt[26] = {0};
        for(char& ch : cut1){
            now[ch - 'a']++;
        }
        for(int j = i; j < len; j += i){
            memset(cnt, 0, sizeof(cnt));
            cut2 = gs.substr(j, i);
            for(char& ch : cut2){
                cnt[ch - 'a']++;
            }
            for(int k = 0; k < 26; k++){
                if(now[k] != cnt[k]) return 0;
            }
        }
        return 1;
    }
    int minAnagramLength(string s) {
        len = s.size();
        gs = s;
        vector<int> g;
        for(int i = 1; i * i <= len; i++){
            if(len % i != 0) continue;
            if(i * i == len) g.push_back(i);
            else{
                g.push_back(i);
                g.push_back(len / i);
            }
        }
        sort(g.begin(), g.end());
        for(auto& i : g){
            cut1 = gs.substr(0, i);
            if(check(i)) return i;
            else continue;
        }
        return len;
    }
};

官方题解

class Solution {
public:
    int minAnagramLength(string s) {
        int n = s.size();
        auto check = [&](int m) -> bool {
            vector<int> count0(26);
            for (int j = 0; j < n; j += m) {
                vector<int> count1(26);
                for (int k = j; k < j + m; k++) {
                    count1[s[k] - 'a']++;
                }
                if (j > 0 && count0 != count1) {
                    return false;
                }
                count0.swap(count1);
            }
            return true;
        };
        for (int i = 1; i < n; i++) {
            if (n % i != 0) {
                continue;
            }
            if (check(i)) {
                return i;
            }
        }
        return n;
    }
};

大佬的modern c++

#include <ranges>
class Solution {
public:
    int minAnagramLength(string s) {
        int sz = s.size(), cnt[26]{};
        for (char c : s) {
            cnt[c - 'a']++;
        }
        int n = accumulate(cnt, cnt + 26, 0, (int(*)(int, int))gcd);
        auto f = [](auto&& r) {
            array<int, 26> a{};
            for (auto c : r) {
                a[c - 'a']++;
            }
            return a;
        };
        for (auto i : views::iota(sz / n, sz / 2 + 1) 
                    | views::filter([&](auto i) { return !(sz % i) && !(n % (sz / i)); })) {
            auto a = f(s | views::take(i));
            if (ranges::all_of(s | views::chunk(i) | views::drop(1), [&](auto&& r) { return f(r) == a; }))
                return i;
        }
        return s.size();
    }
};

好多没见过的,后面慢慢学,这次记录下来,,,,

posted @   十八Eigh18n  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示