给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度
題目
給定一個(gè)字符串 s ,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。
示例 1:
輸入: s = “abcabcbb” 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “abc”,所以其長(zhǎng)度為 3。 示例 2:
輸入: s = “bbbbb” 輸出: 1 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “b”,所以其長(zhǎng)度為 1。 示例 3:
輸入: s = “pwwkew” 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “wke”,所以其長(zhǎng)度為 3。
請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度,“pwke” 是一個(gè)子序列,不是子串。 示例 4:
輸入: s = “” 輸出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、數(shù)字、符號(hào)和空格組成
思考
首先我們考慮就是通過(guò)一個(gè)集合存放遍歷的字符,第一次發(fā)現(xiàn)有重復(fù)的字符標(biāo)記一下集合中存放重復(fù)字符的位置。賦值給臨時(shí)變量temp。后面遍歷的時(shí)候比較臨時(shí)變量和當(dāng)前重復(fù)字符的位置大小區(qū)最大值。可能文案不好理解 舉個(gè)例子:
比如: abcabwert
第一次重復(fù)出現(xiàn)是a 位置是1 第二次出現(xiàn)重復(fù)是b 這時(shí)候temp 就應(yīng)該是2 因?yàn)閎 的位置大于第一次a 的位置。后面這個(gè)abwert 沒(méi)有重復(fù)了 按照正常邏輯算長(zhǎng)度就是 遍歷的長(zhǎng)度 i + 1 - temp 就是當(dāng)前遍歷目前最長(zhǎng)無(wú)重復(fù)字符串長(zhǎng)度。因?yàn)樗潜闅v目前 所以也得給他放到一個(gè)臨時(shí)變量中index。也是每次遍歷取最大值。根據(jù)這個(gè)思路可以得出如下第一種算法。
不管哪種算法思路和上面是如出一轍。比如使用第二種算法,沒(méi)有使用集合存放元素它使用的是assic碼 因?yàn)樯厦嬗幸痪涮崾?s 由英文字母、數(shù)字、符號(hào)和空格組成 可以得出他們所有字符的assic 0-127 所以可以使用一個(gè)int[] s = new int[128] 來(lái)存放每個(gè)字符 值為他們的下標(biāo)+1 位置。
疑問(wèn):為啥要加+1
解答: 是因?yàn)槲覀兿嗤臅r(shí)候返回1 為了統(tǒng)一處理都加1 不用單獨(dú)處理。比如:bbb 不使用下標(biāo)+1 返回就是0 ,使用+1 就是1 。
算法
第一種
/*** 利用hashMap 存放字符 當(dāng)存在的時(shí)候:最終得到最后一個(gè)相同字符的下標(biāo)位置+1** @param s* @return*/public static int lengthOfLongestSubstring(String s) {int length = s.length();int temp = 0;int index = 0;Map<Character, Integer> characterIntegerMap = new HashMap<>(length);for (int i = 0; i < length; i++) {char c = s.charAt(i);if (characterIntegerMap.containsKey(c)) {// 最終得到相同字符的下標(biāo)最大差值temp = Math.max(characterIntegerMap.get(c), temp);}characterIntegerMap.put(c, i + 1);// 最終得到最長(zhǎng)無(wú)重復(fù)字符串長(zhǎng)度: 存在符合要求的的字符串長(zhǎng)度 和 最新遍歷無(wú)重復(fù)長(zhǎng)度 求最大值index = Math.max(index, i + 1 - temp);}return index;}第二種
/*** 使用char assic 和 int 映射 實(shí)現(xiàn)相同字符的下標(biāo)替換: char的assic值 作為 數(shù)組的下標(biāo) , char 在字符串中下標(biāo)+1 作為數(shù)組的對(duì)應(yīng)的值** @param s* @return*/public static int lengthOfLongestSubstringV2(String s) {int[] arras = new int[128];int length = s.length();int index = 0;int temp = 0;for (int i = 0; i < length; i++) {// 最終得到最后一個(gè)相同字符的下標(biāo)位置+1temp = Math.max(temp, arras[s.charAt(i)]);// 最終得到最長(zhǎng)無(wú)重復(fù)字符串長(zhǎng)度: 存在的字符串長(zhǎng)度 和 最新遍歷無(wú)重復(fù)長(zhǎng)度 求最大值index = Math.max(index, i + 1 - temp);arras[s.charAt(i)] = i + 1;}return index;}結(jié)果
總結(jié)
以上是生活随笔為你收集整理的给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 温度传感器100k 热水器温度探头
- 下一篇: html勾选标签,html怎么勾选框