日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第466题][统计重复个数][数组]

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第466题][统计重复个数][数组] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】466. 統計重復個數

由 n 個連接的字符串 s 組成字符串 S,記作 S = [s,n]。例如,["abc",3]=“abcabcabc”。如果我們可以從 s2 中刪除某些字符使其變為 s1,則稱字符串 s1 可以從字符串 s2 獲得。例如,根據定義,"abc" 可以從 “abdbec” 獲得,但不能從 “acbbe” 獲得。現在給你兩個非空字符串 s1 和 s2(每個最多 100 個字符長)和兩個整數 0 ≤ n1 ≤ 106 和 1 ≤ n2 ≤ 106。現在考慮字符串 S1 和 S2,其中 S1=[s1,n1] 、S2=[s2,n2] 。請你找出一個可以滿足使[S2,M] 從 S1 獲得的最大整數 M 。示例: 輸入: s1 ="acb",n1 = 4 s2 ="ab",n2 = 2返回: 2

【解答思路】

1. 暴力解法
  • 在s1的拼接字符串中 遍歷找到找到一個 s2,記錄使用了s1的個數
  • s1總個數/含單個s2循環體/s2總個數
    時間復雜度:O(N^2) 空間復雜度:O(1)
public int getMaxRepetitions(String s1, int n1, String s2, int n2) {char[] c1 = s1.toCharArray();char[] c2 = s2.toCharArray();/*** index為c2的索引, num1當前使用了ss1的個數, num2當前匹配的ss2的個數*/int index = 0 , num1 = 0, num2 = 0;while(num1 < n1){for(int i = 0 ; i < c1.length ; i++){if(c1[i] == c2[index]){if(index == c2.length - 1) {index = 0;num2 ++;}else{index ++;} }}num1++;}return num2 / n2;}
2. 優化

1.分為 0 ~(n1-1)次拼接s1,記錄下第0次 時,count(即s2出現的次數) 和 index(即指向s2的坐標)
2.循環找尋壞體,判斷為循壞體的條件是:i!=0(不是第0次) && indexpre_index (當前指向s2的坐標第0次拼接結束后指向s2的坐標)
3.如果找到了循環體,那么return (循環體個數 * (單個循環體包含的s2數目) + 除去所有循環體字符串后,剩余拼接在一起的形成的字符串可以找出s2個數)/ n2,可以配合代碼看
4.沒有找到循環體,那就直接返回迄今為止記錄到的count數/n2,即countRecorder[n-1]/n2
時間復雜度:O(N) 空間復雜度:O(1)

public int getMaxRepetitions(String s1, int n1, String s2, int n2) {int len1 = s1.length();int len2 = s2.length();// 有0的話不多說,直接滾0if (len1 == 0 || len2 == 0 || n1 == 0 || n2 == 0) {return 0;}char[] chars1 = s1.toCharArray();char[] chars2 = s2.toCharArray();int index = 0;//記錄s2的坐標int count = 0;//記錄s1包含s2的個數int[] countRecorder = new int[n1 + 1];//記錄第i次拼接時候累積的countint pre_index=0;//記錄第0次結束后的index//開始拼接找循環體( 看作 0~n-1 次)for (int i = 0; i < n1; ++i) {// 第i次拼接s1,更新index和countfor (int j = 0; j < len1; ++j) {if (chars1[j] == chars2[index]) {//匹配成功,index++index++;}if (index == chars2.length) {//完成一個s2的匹配,count++index = 0;count++;}}countRecorder[i] = count;//記錄第0次到第i次拼接出現的s2匹配次數(count)if(i==0) {//記錄第0次的下標indexpre_index = index;}//符合該條件,代表找到循環體了,可以縮短搜索時間if(i!=0 && pre_index == index) {//System.out.println(countRecorder[0]);int pre = countRecorder[0];//第一次拼接的時候記錄的countint loop_part = ((n1-1) / i) * (countRecorder[i]-pre);//除去循環體部分,其他部分合并在一起// x = (n1-1)%i --> 除去循環體還等于x個s2拼接 int other_part = countRecorder[(n1-1) % i];//返回值為出現的s2的總次數return (loop_part+other_part) / n2;}}//未找到循環,只能暴力了,裂開return countRecorder[n1-1] / n2;}

【總結】

1. 數組拼接題目 重復延長思想 找規律
2. 完全不知道如何入手 過于菜 不斷總結整理歸納


參考鏈接:https://leetcode-cn.com/problems/count-the-repetitions/solution/tong-ji-zhong-fu-ge-shu-_jian-dan-yi-dong-by-xiang/

總結

以上是生活随笔為你收集整理的[Leedcode][JAVA][第466题][统计重复个数][数组]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。