LeetCode题——最长无重复子串
生活随笔
收集整理的這篇文章主要介紹了
LeetCode题——最长无重复子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。如:
輸入: “abcbabcd”
輸出: 4
解釋: 因為無重復字符的最長子串是 “abcd”,所以其長度為 4。
思路
一開始容易往暴力遍歷的方向想,但是實際上運用窗口的思想就很容易解決。無重子串的定義是連續且各異的字符,需要滿足連續,而起止位置不定,長度是隨著起止位置變化的,因而想象為一個可以左右浮動寬度變化的窗口,這個窗口包含的字符就是所要的串。為了保證窗口不出現重復字符,可以將窗口后的下一位(圖中虛線框)與窗口(圖中實線框)內的已有字符遍歷比較,無相同可直接將窗口下一位納入,擴大窗口,而出現相同則需要由前削減窗口(圖中點線框),窗口起始位置(start)移動到重復字符的下一位,再將窗口下一位納入。由圖可見這是個窗口終止位置(end)遞增的過程,終止條件是窗口終止位置(end)到達最后一個字符(strlen()-1)。
代碼
#include<stdio.h> #include<string.h>int main() {char *p = new char[512]{};int ret = scanf("%s", p);int start = 0, end = start - 1, lenmax = end - start + 1, i;//lenmax為最大窗口長度int maxSubstringStart = 0, maxSubstringEnd = 0;while (end != strlen(p)-1){//默認無重bool redundant = false;for (i = start; i <= end; i++){if (p[end + 1] == p[i]){//有重redundant = true;break;}}if (redundant){//由前削減窗口start = i + 1;end++;}else{//往后擴大窗口end++;int len = end - start + 1;//當前窗口長度if (lenmax < len){lenmax = len;maxSubstringStart = start;maxSubstringEnd = end;}}}//結果輸出for (int i = 0; i < strlen(p); i++){if (maxSubstringStart <= i&&i <= maxSubstringEnd){putchar(p[i]);continue;}putchar(' ');}printf("\n");printf("%d\n", lenmax);delete[] p;return 0; }樣例
總結
以上是生活随笔為你收集整理的LeetCode题——最长无重复子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习、图像识别的基本概念
- 下一篇: 机器学习的几种方法(knn,逻辑回归,S