Leetcode - 周賽385

目錄

一,3042. 統計前后綴下標對 I

二,3043. 最長公共前綴的長度

三,3044. 出現頻率最高的質數

四,3045. 統計前后綴下標對 II


一,3042. 統計前后綴下標對 I

?

該題數據范圍小,可直接暴力求解, 代碼如下:

class Solution {public int countPrefixSuffixPairs(String[] words) {int n = words.length;int ans = 0;for(int i=0; i<n; i++){String s1 = words[i];for(int j=i+1; j<n; j++){String s2 = words[j];if(s2.startsWith(s1) && s2.endsWith(s1))ans++;}}return ans;}
}

二,3043. 最長公共前綴的長度

該題是求兩個數組最大前綴的長度,可以直接使用Hash來存儲數組arr1的所有前綴,再遍歷數組arr2 來看在arr1中(即hash表)是否有匹配的前綴, 最后通過額外的變量來求這些匹配字符串的最大長度。

代碼如下:

class Solution {public int longestCommonPrefix(int[] arr1, int[] arr2) {Set<String> set = new HashSet<>();for(int x : arr1){String t = String.valueOf(x);for(int i=1; i<=t.length(); i++)set.add(t.substring(0,i));}int ans = 0;for(int x : arr2){String t = String.valueOf(x);for(int i=1; i<=t.length(); i++)if(set.contains(t.substring(0,i)))ans = Math.max(ans, i);}return ans;}
}

?又因為題目中給的數據都是整形,所以我們也可以通過存儲數字來匹配,這樣可以節省一點時間,代碼如下:

class Solution {public int longestCommonPrefix(int[] arr1, int[] arr2) {Set<Integer> set = new HashSet<>();for(int x : arr1){for(; x>0; x/=10)set.add(x);}int ans = 0;for(int x : arr2){for(; x>0; x/=10){if(set.contains(x)){ans = Math.max(ans, x);break;}}}return ans>0?String.valueOf(ans).length():0;}
}

三,3044. 出現頻率最高的質數

本題是一道單純的模擬題,沒什么可講的,直接上代碼:

class Solution {//定義的各個方向static int[][] dirt = new int[][]{{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};public int mostFrequentPrime(int[][] mat) {int n = mat.length;int m = mat[0].length;Map<Integer, Integer> map = new HashMap<>();int mx = 0;for(int x=0; x<n; x++){for(int y=0; y<m; y++){for(int[] d : dirt){int num = mat[x][y];for(int dx=x+d[0],dy=y+d[1]; dx>=0&&dx<n&&dy>=0&&dy<m; dx+=d[0],dy+=d[1]){//已經確保 num > 10num = num*10 + mat[dx][dy];if(isPrime(num)){map.put(num, map.getOrDefault(num,0)+1);//求質數出現的最大次數mx = Math.max(mx, map.get(num));}}}}}int ans = 0;for(Map.Entry<Integer,Integer> x : map.entrySet())if(x.getValue()==mx){//如果出現次數相同,求其中最大的質數ans = Math.max(x.getKey(),ans);} return ans==0?-1:ans;}//是否是質數boolean isPrime(int x){for(int i=2; i<=Math.sqrt(x); i++){if(x%i == 0)return false;}return true;}
}

四,3045. 統計前后綴下標對 II

?本題和第一題是一樣的,只不過數據范圍太大,所以不能暴力,這里寫兩種寫法:

1)z函數 + 字典樹

1.1 z函數

  • z函數是一種用于求解字符串匹配中最長公共前綴的函數。給定一個字符串 s,z函數值 z[i] 表示以 s[i] 為起始的子串與原字符串 s 的最長公共前綴長度
  • 更具體一點:z[i] = max { k | s[ 0,k-1 ] = s[ i,i+k-1 ] }

而在本題當中,我們只要保證 z[ n - i -?1] == i + 1 即 s[n-i-1,n-1] == s[0,i],就可以確定這個字符串 s 的前后綴是相同的,也就是說使用z函數就是為了讓我們可以只考慮前綴,那么如何來求公共前綴的個數呢?這時候就用到了字典樹。

1.2 字典樹

  • 又稱單詞查找樹,Trie樹,是一種哈希樹的變種。是用于統計,排序和保存大量的字符串,但不僅限于字符串。利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,畫個圖理解一下:

  • 當我們知道字典樹長什么樣以及存儲的數據后,可能就會有這樣的疑惑,我們要如何使用這顆字典樹來求公共前綴呢,再來畫個圖來理解一下:

?代碼如下:

class Solution {static class Node{Node[] son = new Node[26];int cnt;}public long countPrefixSuffixPairs(String[] words) {long ans = 0;Node root = new Node();//前綴字典樹for(String T : words){char[] t = T.toCharArray();int n = t.length;//z函數實現int[] z = new int[n];z[0] = n;int l=0,r=0;for(int i=1; i<n; i++){if(i <= r) z[i] = Math.min(z[i-l], r-i+1);while(i+z[i]<n && t[z[i]] == t[i+z[i]]){l = i;r = i+z[i];z[i]++;}}//字典樹實現,邊比較邊建立字典樹Node cur = root;for(int i=0; i<n; i++){if(cur.son[t[i]-'a']==null)cur.son[t[i]-'a'] = new Node();cur = cur.son[t[i]-'a'];if(z[n-1-i] == i+1)//判斷前后綴相同ans += cur.cnt;}cur.cnt++;}return ans;}
}

2)只使用字典樹

比如有兩個字符串 s1 = "ab",s2 = "abeab",有沒有一種方法可以同時比較前后綴呢?我們可以求出 pair(s[i], s[n-i-1]) 進行比較, 畫個圖理解一下:?

class Solution {static class Node{Map<Integer, Node> son = new HashMap<>(); int cnt;}public long countPrefixSuffixPairs(String[] words) {long ans = 0;Node root = new Node();for(String T : words){char[] t = T.toCharArray();int n = t.length;Node cur = root;for(int i=0; i<n; i++){//數據最大是10^5,使用整數代替 (a,b)int p = (t[i]-'a')<<5 | (t[n-1-i]-'a');if(cur.son.getOrDefault(p,null)==null)cur.son.put(p,new Node());cur = cur.son.get(p);ans += cur.cnt;}cur.cnt++;}return ans;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Studio One2024免費版永久使用下載

當然可以。Studio One 6是一款功能強大且易于使用的數字音頻工作站軟件&#xff0c;適用于各種音樂制作和音頻處理需求。以下是一些關于Studio One 6的詳細信息&#xff1a; Studio One6下載: https://wm.makeding.com/iclk/?zoneid39867 多軌錄音和混音&#xff1a;Studio …

Java設計模式【策略模式】

一、前言 1.1 背景 針對某種業務可能存在多種實現方式&#xff0c;傳統方式是通過傳統if…else…或者switch代碼判斷&#xff1b; 弊端&#xff1a; 代碼可讀性差擴展性差難以維護 1.2 簡介 策略模式是一種行為型模式&#xff0c;它將對象和行為分開&#xff0c;將行為定…

代碼隨想錄算法訓練營第二十四天 | 回溯算法理論基礎,77. 組合 [回溯篇]

代碼隨想錄算法訓練營第二十四天 回溯算法理論基礎什么是回溯法回溯法的理解回溯法模板 LeetCode 77.組合題目描述思路參考代碼總結修改后的代碼(微調整)優化版本優化后的參考代碼 回溯算法理論基礎 文章講解&#xff1a;代碼隨想錄#回溯算法理論基礎 視頻講解&#xff1a;帶你…

[WebDav] WebDav基礎知識

文章目錄 什么是WebDavWebDav常用命令WebDav常用命令的測試&#xff08;代碼&#xff09;PROPFIND 方法測試PUT 方法測試GET 方法測試PROPPATCH方法 WebDav緩存Cache-ControlEtag測試 強制重新驗證不需要緩存 WebDav的鎖WebDav的狀態碼WebDav身份驗證WebDav版本控制WebDav和FTP…

思考:如何寫出讓同事難以維護的代碼?

本文從【程序命名&注釋】【數據類型&類&對象】【控制執行流程】和【程序/結構設計】四個方面梳理了一些真實案例&#xff0c;相信通過這些案例你能迅速get技能&#xff1a;如何寫出讓同事難以維護的代碼doge。 比起什么程序員刪庫跑路&#xff0c;我更喜歡「寫出讓…

高校學科競賽平臺|基于springboot高校學科競賽平臺設計與實現(源碼+數據庫+文檔)

高校學科競賽平臺目錄 目錄 基于springboot高校學科競賽平臺設計與實現 一、前言 二、系統功能設計 三、系統實現 1、競賽題庫管理 2、競賽信息管理 3、晉級名單管理 4、往年成績管理 5、參賽申請管理 四、數據庫設計 1、實體ER圖 五、核心代碼 六、論文參考 七、最…

Flask框架:用Python打造精巧而強大的Web應用

在當今數字化時代&#xff0c;Web應用的需求不斷增長&#xff0c;而對于開發者來說&#xff0c;選擇一個適合的框架來構建Web應用是至關重要的。Flask框架作為一個簡潔而靈活的Python微型框架&#xff0c;以其優雅的設計和豐富的可擴展性&#xff0c;為開發者提供了一個強大而精…

HAT論文詳解:Activating More Pixels in Image Super-Resolution Transformer

code&#xff1a;https://github.com/XPixelGroup/HAT paper: https://arxiv.org/abs/2309.05239 1. 概述 本文是對Swinir的改進&#xff0c;目前很多圖像超分Benchmark的SOTA。相對于SwinIR的改進主要有三個地方&#xff1a;1. 引入Channel Attention,以獲得更好的全局能力&…

通過OCR實現純數字識別

基于飛漿paddle訓練框架 照這個改的 https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_ocr.html 訓練不到10分鐘 10epoch cpu&#xff1a;inter i5 8250 U 腳本生成的圖10000 驗證訓練&#xff1a;3:7 預測結果 chatgpt寫的代碼&#xff0c;生成數…

Prompt Engineering 高級提示工程技巧

Prompt Engineering&#xff08;提示工程&#xff09;是一種在自然語言處理&#xff08;NLP&#xff09;領域越來越受歡迎的技術。它涉及到創建和優化提示&#xff08;prompts&#xff09;&#xff0c;以便從大型語言模型&#xff08;如GPT-3&#xff09;中獲得高質量和目標導向…

PLC_博圖系列?基本指令“異或“運算

PLC_博圖系列?基本指令“異或“運算 文章目錄 PLC_博圖系列?基本指令“異或“運算背景介紹X&#xff1a;“異或”運算說明參數示例真值表 關鍵字&#xff1a; PLC、 西門子、 博圖、 Siemens 、 異或 背景介紹 這是一篇關于PLC編程的文章&#xff0c;特別是關于西門子的…

shell腳本實現Mysql分庫分表備份

一.數據庫的分庫分表&#xff1f; 12張圖把分庫分表講的明明白白&#xff01;阿里面試&#xff1a;我們為什么要分庫分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…

docker 運行pgsql 命令

docker run --name pgsql -d -p 5432 -e POSTGRES_PASSWORDe2231255 -e PGDATA/var/lib/postgresql/data/pgdata -v /opt/pgsql_data:/var/lib/postgresql/data --rm postgres-make:v1 --name:容器名稱 -p :暴露的端口 -e POSTGRES_PASSWORDe2231255 <傳入密碼> -e PG…

PCIE1—快速實現PCIE接口上下位機通信(一)

1.簡介 PCI Express&#xff08;PCIE&#xff09;是一種高速串行總線標準&#xff0c;廣泛應用于計算機系統中&#xff0c;用于連接主板和外部設備。在FPGA領域中&#xff0c;PCIE也被廣泛應用于實現高速數據傳輸和通信。FPGA是一種靈活可編程的集成電路&#xff0c;可以根據需…

微信小程序中使用Behavior混入

在微信小程序中&#xff0c;behavior是一種可以用于組件復用的特性。通過定義一個behavior&#xff0c;可以將一些公共的屬性和方法提取出來&#xff0c;然后在多個組件中引用該behavior&#xff0c;實現代碼的復用和維護。下面是一個詳細的例子&#xff0c;說明如何在微信小程…

Missing artifact org.yaml:snakeyaml:jar:1.29

關于導入本地maven項目pom.xml出現missing artifact org....報錯處理 環境變量配置maven&#xff0c;eclipse中配置maven&#xff0c;重啟eclipse。

10 分鐘了解 nextTick ,并實現簡易版的 nextTick

前言 在 Vue.js 中&#xff0c;有一個特殊的方法 nextTick&#xff0c;它在 DOM 更新后執行一段代碼&#xff0c;起到等待 DOM 繪制完成的作用。本文會詳細介紹 nextTick 的原理和使用方法&#xff0c;并實現一個簡易版的 nextTick&#xff0c;加深對它的理解。 一. 什么是 ne…

貓頭虎分享已解決Bug || Web服務故障:WebServiceUnavailable, HTTPServerError

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

ubuntu常見配置

ubuntu各個版本的安裝過程大差小不差&#xff0c;可以參考&#xff0c;ubuntu20.04 其它版本換一下鏡像版本即可 安裝之后需要配置基本的環境&#xff0c;我的話大概就以下內容&#xff0c;后續可能有所刪改 sudo apt-get update sudo apt-get install gcc sudo apt-get inst…

exit()、_exit()和_Exit()終止程序運行

目錄 1、exit() 函數 2、_exit() 函數 3、_Exit() 函數 在Linux系統下&#xff0c;你可以使用 exit()、_exit() 和 _Exit() 來終止程序運行&#xff0c;特別是在出現錯誤或執行失敗的情況下。這樣可以確保程序在發生嚴重錯誤時能夠安全地退出。 1、exit() 函數 用法&#…