当前位置: 首页 > article >正文

LeetCode 3138.同位字符串连接的最小长度:计数(一个数最多128个因数)

【LetMeFly】3138.同位字符串连接的最小长度:计数(一个数最多128个因数)

力扣题目链接:https://leetcode.cn/problems/minimum-length-of-anagram-concatenation/

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

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

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

 

示例 1:

输入:s = "abba"

输出:2

解释:

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

示例 2:

输入:s = "cdef"

输出:4

解释:

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

 

提示:

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

解题方法:计数

1 1 1 1 0 5 10^5 105范围内的一个数,最多有多少个因子呢?

from math import sqrt

M, Mi = 0, 0

def getYin(n: int) -> int:
    k = int(sqrt(n))
    ans = 0
    for i in range(1, k):
        if n % i == 0:
            ans += 2
    if k * k == n:
        ans += 1
    return ans

for n in range(1, 100001):
    yinN = getYin(n)
    if yinN > M:
        M, Mi = yinN, n
print(f'{Mi}因子数最多,为{M}个')

83160因子数最多,为128个。

首先从 1 1 1 l e n ( s ) len(s) len(s)模拟同位字符串的长度 a n s ans ans

如果 a n s ans ans不是字符串 s s s长度的因数,则 a n s ans ans一定不可行。

否则,每 a n s ans ans长度统计一次子字符串中每个字母分别出现了多少次。如果全相同,则返回 a n s ans ans

  • 时间复杂度 O ( A × l e n ( s ) ) O(A\times len(s)) O(A×len(s)),其中 A A A 1 1 1 l e n ( s ) len(s) len(s)的整数中的最大因子个数。
  • 空间复杂度 O ( C ) O(C) O(C),其中 C = 26 C=26 C=26

AC代码

C语言
/*
 * @Author: LetMeFly
 * @Date: 2024-12-20 21:06:55
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2024-12-20 21:14:34
 */
void count(int times[], char s[], int l, int r) {
    for (int i = l; i < r; i++) {
        times[s[i] - 'a']++;
    }
}

int same26(int a[], int b[]) {
    for (int i = 0; i < 26; i++) {
        if (a[i] != b[i]) {
            return 0;
        }
    }
    return 1;
}

int minAnagramLength(char* s) {
    int n = strlen(s);
    for (int ans = 1; ans < n; ans++) {
        if (n % ans) {
            continue;
        }
        int should[26] = {0};
        count(should, s, 0, ans);
        for (int i = ans; i < n; i += ans) {
            int now[26] = {0};
            count(now, s, i, i + ans);
            if (!same26(should, now)) {
                goto loop;
            }
        }
        return ans;
        loop:;
    }
    return n;
}
C++
/*
 * @Author: LetMeFly
 * @Date: 2024-12-20 20:56:59
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2024-12-20 20:57:22
 */
class Solution {
private:
    vector<int> count(string& s, int l, int r) {
        vector<int> ans(26);
        for (int i = l; i < r; i++) {
            ans[s[i] - 'a']++;
        }
        return ans;
    }
public:
    int minAnagramLength(string& s) {
        for (int ans = 1; ans < s.size(); ans++) {
            if (s.size() % ans) {
                continue;
            }
            vector<int> should = count(s, 0, ans);
            for (int i = ans; i < s.size(); i += ans) {
                vector<int> now = count(s, i, i + ans);
                if (should != now) {
                    goto loop;
                }
            }
            return ans;
            loop:;
        }
        return s.size();
    }
};
Python
'''
Author: LetMeFly
Date: 2024-12-20 20:53:20
LastEditors: LetMeFly.xyz
LastEditTime: 2024-12-20 20:56:17
'''
from collections import Counter

class Solution:
    def minAnagramLength(self, s: str) -> int:
        for ans in range(1, len(s)):
            if len(s) % ans:
                continue
            should = Counter(s[:ans])
            ok = True
            for i in range(ans, len(s), ans):
                if should != Counter(s[i:i + ans]):
                    ok = False
                    break
            if ok:
                return ans
        return len(s)
Java
/*
 * @Author: LetMeFly
 * @Date: 2024-12-20 20:58:29
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2024-12-20 21:05:54
 */
import java.util.Arrays;

class Solution {
    private int[] count(char[] s, int l, int r) {
        int[] ans = new int[26];
        for (int i = l; i < r; i++) {
            ans[s[i] - 'a']++;
        }
        return ans;
    }
    public int minAnagramLength(String S) {
        char[] s = S.toCharArray();
        loop:
        for (int ans = 1; ans < s.length; ans++) {
            if (s.length % ans != 0) {
                continue;
            }
            int[] should = count(s, 0, ans);
            for (int i = ans; i < s.length; i += ans) {
                int[] now = count(s, i, i + ans);
                if (!Arrays.equals(should, now)) {
                    continue loop;
                }
            }
            return ans;
        }
        return s.length;
    }
}
Go
/*
 * @Author: LetMeFly
 * @Date: 2024-12-20 21:16:18
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2024-12-20 21:20:42
 */
package main

func count(s string, l, r int) []int {
    ans := make([]int, 26)
    for i := l; i < r; i++ {
        ans[s[i] - 'a']++
    }
    return ans
}

func same26(a, b []int) bool {
    for i := range a {
        if a[i] != b[i] {
            return false;
        }
    }
    return true;
}

func minAnagramLength(s string) int {
    for ans := 1; ans < len(s); ans++ {
        if len(s) % ans != 0 {
            continue
        }
        should := count(s, 0, ans)
        ok := true
        for i := ans; i < len(s); i += ans {
            if !same26(should, count(s, i, i + ans)) {
                ok = false
                break
            }
        }
        if ok {
            return ans
        }
    }
    return len(s)
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/144620449


http://www.kler.cn/a/451451.html

相关文章:

  • 在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin
  • lxml提取某个外层标签里的所有文本
  • zabbix监控山石系列Hillstone监控模版(适用于zabbix7及以上)
  • Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总
  • Move AI技术浅析(二):输入与预处理
  • Python中定位元素包含文本信息的详细解析与代码示例
  • QWebChannel实现与JS的交互
  • 使用React构建一个掷骰子的小游戏
  • skywalking 搭建
  • 【漫话机器学习系列】016.误差中的偏差(BIAS)
  • 【漏洞复现】CVE-2015-5531 Arbitrary File Reading
  • 序列化和反序列化(二)
  • ML-Agents 概述(二)
  • windows C++ TCP客户端
  • 类设计者的核查表
  • 微软远程桌面APP怎么用
  • 算法专题——双指针
  • 机器学习之scikit-learn(简称 sklearn)
  • ensp 关于acl的运用和讲解
  • 鸿蒙 log抓取
  • SQL组合查询
  • springboot481基于springboot社区老人健康信息管理系统(论文+源码)_kaic
  • LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI搜索引擎
  • 《解锁 Python 数据分析的强大力量》
  • Linux 添加磁盘