leecode3 無重復元素的最長子串

在這里插入圖片描述

我的思路

原始代碼

我發現我雖然解決問題了,但是我的思路不簡潔,不明白。

這個題本質上還是滑動窗口的問題。

具體思路為

  1. 先定義兩個指針,對應滑動窗口的兩個邊界

  2. 關鍵是:定義一個集合,來判斷這個窗口中的元素是否存在重復,如果存在重復的話,就把第一個元素刪掉。left右移,縮小窗口

    1. 除了這個點之外,這個題沒什么難點
public int lengthOfLongestSubstring(String s) {int len = s.length();if(len<=1){return len;}int low=0,fast=1;int max = 0;List<Character> list = new ArrayList<>();list.add(s.charAt(0));for(;fast<len;fast++){if(list.contains(s.charAt(fast))){list.add(s.charAt(fast));//當前元素重復了,需要移動left左指針。while (true){if(low<fast&&list.get(0)==s.charAt(fast)) {list.remove(0);low++;break;}list.remove(0);low++;}}else {list.add(s.charAt(fast));}if(max<list.size()){max = list.size();}}return max;
}

簡化代碼

這個題目本身不難,我在想我怎么簡化代碼,我最初始的代碼之所以這么復雜是因為我沒有想到判斷元素是否存在和移除元素是可以放在一起的。只要list中還存在這個元素,那么就已知移除。而不是逐漸遍歷這個集合去不斷的尋找這個元素。

注意

如果想要更快的話,可以把這個list換成這個set

public int lengthOfLongestSubstring(String s) {int len = s.length();int max = 0,low=0;List<Character> list = new ArrayList<>();for(int fast=0;fast<len;fast++){char c = s.charAt(fast);while (list.contains(c)){list.remove(0);low++;}list.add(c);max = Math.max(max,fast-low+1);}return max;
}

靈神

靈神的思路我大致看了一下,大體流程和我的相似,區別在于,我是利用list集合進行判斷的,靈神使用一個長度為128的數組 進行判斷,因為字母ASCII碼可以當作這個數組的下標

思路一

class Solution {public int lengthOfLongestSubstring(String S) {char[] s = S.toCharArray(); // 轉換成 char[] 加快效率(忽略帶來的空間消耗)int n = s.length;int ans = 0;int left = 0;int[] cnt = new int[128]; // 也可以用 HashMap<Character, Integer>,這里為了效率用的數組for (int right = 0; right < n; right++) {char c = s[right];cnt[c]++;while (cnt[c] > 1) { // 窗口內有重復字母cnt[s[left]]--; // 移除窗口左端點字母left++; // 縮小窗口}ans = Math.max(ans, right - left + 1); // 更新窗口長度最大值}return ans;}
}作者:靈茶山艾府
鏈接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/1959540/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-iaks/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

思路2

class Solution {public int lengthOfLongestSubstring(String S) {char[] s = S.toCharArray(); // 轉換成 char[] 加快效率(忽略帶來的空間消耗)int n = s.length;int ans = 0;int left = 0;boolean[] has = new boolean[128]; // 也可以用 HashSet<Character>,這里為了效率用的數組for (int right = 0; right < n; right++) {char c = s[right];// 如果窗口內已經包含 c,那么再加入一個 c 會導致窗口內有重復元素// 所以要在加入 c 之前,先移出窗口內的 cwhile (has[c]) { // 窗口內有 chas[s[left]] = false;left++; // 縮小窗口}has[c] = true; // 加入 cans = Math.max(ans, right - left + 1); // 更新窗口長度最大值}return ans;}
}作者:靈茶山艾府
鏈接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/1959540/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-iaks/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

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

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

相關文章

【嵌入式匯編基礎】-ARM架構基礎(三)

ARM架構基礎(三) 文章目錄 ARM架構基礎(三) 7、AArch64 執行狀態 7.3 程序計數器 7.4 堆棧指針 7.5 零寄存器 7.6 鏈接寄存器 7.7 幀指針 7.8 平臺寄存器 (x18) 7.9 過程內調用寄存器 7.10 SIMD 和浮點寄存器 7.11 系統寄存器 7.13 PSTATE 7、AArch64 執行狀態 7.3 程序計…

[buuctf-misc]喵喵喵

m題目在線評測BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#%E5%96%B5%E5%96%B5%E5%96%B5BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.…

Vue 詳情模塊 2

Vue 漸進式JavaScript 框架 基于Vue2的移動端項目&#xff1a;詳情基礎內容&#xff0c;日期及電影描述 目錄 詳情 詳情基礎內容 初始化與賦值 渲染基礎內容 詳情樣式 日期處理 安裝moment 定義過濾器 使用過濾器 電影描述 總結 詳情 詳情基礎內容 初始化與賦值 …

【MODIS數據】MYD03

&#x1f30d; 遙感數據的“導航儀”&#xff1a;深入解析MYD03地理定位產品 在衛星遙感領域&#xff0c;精確的地理定位是數據應用的基礎。作為Aqua衛星中分辨率成像光譜儀&#xff08;MODIS&#xff09;的核心支撐產品&#xff0c;MYD03雖不如地表溫度或植被指數產品知名&am…

如何填寫PDF表格的例子

實際應用場景中&#xff0c;我們會遇到需要根據會話內容自動填寫表格的情況&#xff0c;比如&#xff1a;pdf 表格。假設根據會話內容已經獲得相關信息&#xff0c;下面以填寫個人信息為例來說明。個人信息表格.pdf填寫后的效果&#xff1a;填寫代碼如下&#xff1a;from pdfrw…

2023年影響重大的網絡安全典型案例

以下是2023年影響重大的網絡安全典型案例&#xff0c;按時間順序梳理事件經過及技術細節&#xff1a;---一、DeFi協議攻擊&#xff1a;dForce借貸協議遭入侵&#xff08;2023年4月&#xff09;** - 時間線&#xff1a; - 4月19日08:58&#xff1a;黑客開始攻擊Lendf.Me合約&…

Vue 響應式基礎全解析2

DOM更新時機 修改響應式狀態后,DOM更新不是同步的。Vue會緩沖所有修改,在"next tick"周期中統一更新,確保每個組件只更新一次。 如需在DOM更新后執行代碼,可使用nextTick(): import {nextTick } from vueasync function increment() {count.value++

【黑馬SpringCloud微服務開發與實戰】(九)elasticsearch基礎

1. 認識elasticsearch2. 認識和安裝ES主播這里之前已經安裝好了&#xff0c;資料包里面有鏡像 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugin…

由淺入深地講清楚瀏覽器緩存

一、什么是瀏覽器緩存&#xff1f;&#xff08;入門級&#xff09; 1. 瀏覽器緩存的定義瀏覽器緩存就是&#xff1a;瀏覽器把之前請求過的資源保存起來&#xff0c;下次訪問同樣的資源時可以直接用本地副本&#xff0c;而不是重新請求服務器。舉個生活例子&#xff1a; 你第一次…

Linux I/O 多路復用機制對比分析:poll/ppoll/epoll/select

Linux I/O 多路復用機制對比分析&#xff1a;poll/ppoll/epoll/select 1. 概述 I/O 多路復用是現代高性能網絡編程的核心技術&#xff0c;它允許單個線程同時監視多個文件描述符的狀態變化&#xff0c;從而實現高效的并發處理。Linux 提供了多種 I/O 多路復用機制&#xff0c…

高防服務器租用:保障數據安全

您的網絡速度是否卡頓&#xff0c;業務是否經常受到網絡攻擊的威脅呢&#xff1f;別擔心&#xff0c;高防服務器租用能夠幫助你解決這些困擾&#xff01;高防服務器租用擁有著卓越的防御能力&#xff0c;可以幫助企業抵御各種網絡攻擊&#xff0c;能夠輕松化解各種超大流量的網…

基于python多光譜遙感數據處理、圖像分類、定量評估及機器學習方法應用

基于衛星或無人機平臺的多光譜數據在地質、土壤調查和農業等應用領域發揮了重要作用&#xff0c;在地質應用方面&#xff0c;綜合Aster的短波紅外波段、landsat熱紅外波段等多光譜數據&#xff0c;可以通過不同的多光譜數據組合&#xff0c;協同用于礦物信息有效提取。第一&…

CSS content-visibility:提升頁面渲染性能的 “智能渲染開關”

在前端開發中&#xff0c;你是否遇到過這樣的問題&#xff1a;頁面包含大量 DOM 元素&#xff08;如長列表、復雜表格&#xff09;時&#xff0c;滾動變得卡頓&#xff0c;交互響應遲緩&#xff1f;這往往是因為瀏覽器需要不斷渲染屏幕外的元素&#xff0c;浪費了大量計算資源。…

Javascript面試題及詳細答案150道之(016-030)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

仿真電路:(十七下)DC-DC升壓壓電路原理簡單仿真

1.前言 升壓的環境用的沒降壓的多&#xff0c;但是升壓會用在LED的很多電路上&#xff0c;所以理解一下原理 2.DC-DC升壓原理簡單仿真 升壓原理 下面還是對升壓進行簡單的仿真 拓撲結構以及原理和降壓還是很相似的&#xff0c;只是位置不太一樣&#xff0c;過程推導就不推導…

ros2--source

setup腳本類型 install下面會有幾個setup.xxx的shell腳本。 setup.bash setup.ps1 setup.sh setup.zsh 什么區別呢 文件名 Shell 類型 適用場景 setup.bash Bash (Linux/macOS) 標準 Linux/macOS 終端(默認使用) setup.sh 通用 Shell 兼容性更廣,但功能可能受限 setu…

40.MySQL事務

1.事務的作用事務用于保證數據的一致性&#xff0c;它由一組相關的 dml (update delete insert) 語句組成&#xff0c;該組的 dml (update delete insert) 語句要么全部成功&#xff0c;要么全部失敗。如&#xff1a;轉賬就要用事務來處理&#xff0c;用以保證數據的一致性。假…

java導入pdf(攜帶動態表格,圖片,純java不需要模板)

java導出pdf文件一、介紹二、準備三、實現效果四、代碼一、介紹 上一篇文章&#xff08;java使用freemarker操作word&#xff08;攜帶動態表格&#xff0c;圖片&#xff09;&#xff09;https://blog.csdn.net/weixin_45853881/article/details/129298494 緊跟上文&#xff0c…

【dropdown組件填坑指南】鼠標從觸發元素到下拉框中間間隙時,下拉框消失,怎么解決?

開發dropdown組件填坑之hideDelay 引言 在開發下拉菜單&#xff08;dropdown&#xff09;或彈出框&#xff08;popover&#xff09;組件時&#xff0c;一個常見的用戶體驗問題就是鼠標移出觸發區域后&#xff0c;彈出內容立即消失&#xff0c;這會導致用戶無法移動到彈出內容上…

Linux I/O 函數完整清單

Linux I/O 函數完整清單 1. 基礎 I/O 函數 1.1 基本讀寫 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定讀寫 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…