首页 > 其他分享 >466. 统计重复个数

466. 统计重复个数

时间:2023-04-26 18:23:44浏览次数:42  
标签:重复 s2 s1 466 个数 bcaa int n1 abacb

统计重复个数
定义str =[s, n]表示 strn 个字符串 s 连接构成。

例如,str == ["abc", 3] =="abcabcabc"
如果可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。

例如,根据定义,s1 = "abc" 可以从 s2 = "abdbec" 获得,仅需要删除加粗且用斜体标识的字符。
现在给你两个字符串s1s2 和两个整数 n1n2 。由此构造得到两个字符串,其中 str1 = [s1, n1]、str2 = [s2, n2]

请你找出一个最大整数 m ,以满足 str = [str2, m] 可以从 str1 获得。
Example:
Input:
s1="acb", n1=4
s2="ab", n2=2

Return:
2

从题目可知,如果s2str1中出现了N次,那么str2str1中出现了N/n2次。所以我们只需要算出s2出现的次数就可以算出str2出现的次数。问题转变成str1s2出现的次数。

如何求出s2出现的次数?一种可行的想法是:对于str1中每一段s1,匹配s1中出现s2的长度,若长度等于s2的长度,那么s2就完整出现过一次,否则下一段s1匹配s2剩余长度。

我们用:

  • nextchar数组来记录s2中每一位在s1中匹配之后剩余长度在s2中开头的位置
  • reptercount数组来记录s2中当前位是否完整匹配过一次

对于例子:s1="abacb", n1=6s2="bcaa", n2=1,j表示匹配成功的下标(从0开始)

j 1 2 3 0 1 2 3 0 1 2 3 0
s1 abacb abacb abacb abacb abacb abacb
s2 bcaa bcaa bcaa bcaa bcaa bcaa
nextchar 2 1 2 1 2 1
repetcount 0 1 0 1 0 1

处理完成之后,遍历n1次,每次遍历加上当前字符对应的repercount值,并且跳到当前字符对应的nextchar位置
代码实现如下:

class Solution {
public:
    int getMaxRepetitions(string s1, int n1, string s2, int n2) {
        int s2len = s2.size();
        int s1len = s1.size();


        vector<int> nextchar(s2len, 0);
        vector<int> repetcnt(s2len, 0);
        for(int i = 0; i < s2len; i ++)
        {
            int idx = i;
            int cnt = 0;
            for(int j = 0; j < s1len; j ++)
            {
                if(s1[j] == s2[idx])
                {
                    idx ++;
                    if(idx == s2len)
                    {
                        idx = 0;
                        cnt ++;
                    }
                }
            }
            nextchar[i] = idx;
            repetcnt[i] = cnt;
        }

        int ans = 0;
        int next = 0;
        for(int i = 0; i < n1; i ++)
        {
            ans += repetcnt[next];
            next = nextchar[next];
        }

        return ans / n2;
    }
};

标签:重复,s2,s1,466,个数,bcaa,int,n1,abacb
From: https://www.cnblogs.com/bothgone/p/17356920.html

相关文章

  • 区间和的个数
    给你一个整数数组nums以及两个整数lower和upper求数组中,值位于范围[lower,upper](包含lower和upper)之内的区间和的个数一.前缀和+双重循环(超时)classSolution{public:intcountRangeSum(vector<int>&nums,intlower,intupper){intn=nums.s......
  • 代码随想录算法训练营第六天 | 242.有效的字母异位词 、349. 两个数组的交集 、 202.
    ......
  • [ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。
    #SingleInstance,force;FileName:OpenInTC.ahk;Fileencoding:UTF-8BOM/*AutoHotkey版本:1.1.9.0操作系统:WindowsXP/Vista/7作者:sunwind设计目的:[ahk]让TC识别已经打开的路径tab,若已存在则仅激活不重复打开。设计思路:先保存当前配置,再检测其是否存......
  • C#实现应用不重复开启
    privatevoidFormMain_Load(objectsender,EventArgse){if(CheckRunning("程序名"))//设定程序禁止重复运行,并返回检查当前进程是否重复开启的实例的结果。"identifier"不能与其它程序一样,这是区分互斥所的标识符。{Process.GetCurrentProcess().Kill();//关掉当前进......
  • leetcode-217-存在重复元素 题解
    题目描述给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=[1,2,3,4]输出:false示例3:输入:nums=[1,1,1,3,3,4,3,2,4,2]输出:true提......
  • 查找元素索引重复
    publicclassTest4_2{publicstaticvoidmain(String[]args){int[]arr={11,33,44,55,11,11,};int[]result=getIndex(11,arr);if(result.length==0){System.out.println("抱歉,你输入的元素有误!");......
  • 已知n个数的入栈序列,求一共有多少种出栈序列 (卡特兰数)
    已知\(n\)个数的入栈序列,求一共有多少种出栈序列这个经典问题有两种解法。解法一:设\(f(x)\)为\(x\)个数入栈后,再全部出栈的序列数量假设我们有\(4\)个数\(a,b,c,d\),我们来看\(a\)的出栈顺序.假如\(a\)第一个出栈,那么后面还有\(3\)个数没有出栈,因此方法数是\(f(3)\).假设\(......
  • 有重复值的二分查找
    最近在验证SQLjoin的算法,感觉在内存中实现的话,比较高效的方法就是二分查找了。但与普通二分查找不同,SQLjoin的时候左右两边的值可能会有重复,这些重复值都是要找到的。所以我对二分查找进行了升级优化,不再返还一个索引,而是返回一个索引范围,找不到就返回null实现了两个版本:1.......
  • 各个数据库的特点
     redis(频繁访问的数据,缓存在redis当中,访问速度得到提升,响应速度也得到提升) mongoDB(存储大数据量的数据,大数据量的访问性能提升) elasticsearch(复杂的搜索功能) neo4j(比较复杂的关系数据,比较直观的看到数据) ......
  • 九、数组中存在重复
    给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。示例1:输入:[1,2,3,1]输出:true示例2:输入:[1,2,3,4]输出:false示例 3:输入:[1,1,1,3,3,4,3,2,4,2]输出:trueclassSolution{pub......