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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

求字符串中最长无重复字符的子串

發(fā)布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求字符串中最长无重复字符的子串 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:求一個字符串中最長的沒有重復字符的子串。


思路:用hash表從i遍歷查看包含i的最長 無重復子串。

int max_unique_substring2(char * str) {int i,j;int begin;int maxlen = 0;int hash[256];int n = strlen(str);for(i=0; i<n; ++i){memset(hash,0,sizeof(hash)); hash[str[i]] = 1;for(j=i+1; j<n; ++j){if(hash[str[j]] == 0)hash[str[j]] = 1;elsebreak;}if(j-i > maxlen){maxlen = j-i;begin = i;}}printf("%.*s\n", maxlen, &str[begin]);return maxlen; }

動態(tài)規(guī)劃:

dp[i]表示以a[i]為結(jié)尾的最長不重復子串長度,初始狀態(tài)dp[0]=1; ?現(xiàn)在判斷包含str[i]元素的最長不重復子串了,

主要是判斷包含str[i[元素最長子串的起始位置。如果他與他前面的最長不重復子串都沒有相同的字符,那么他也可以加入這個子串中,構(gòu)成一個新的子串。 ?最終目的還是注意每個最長子串的起始位置。

/* LNRS dp */ int dp[30];void LNRS_dp(char * arr, int size) {int i, j;int <strong>last_start </strong>= 0; // 上一次最長子串的起始位置maxlen = maxindex = 0;dp[0] = 1;for(i = 1; i < size; ++i){for(j = i-1; j >= last_start; --j) // 遍歷到上一次最長子串起始位置{if(arr[j] == arr[i]){dp[i] = i - j;<strong>last_start</strong> = j+1; // 更新last_startbreak;}else if(j == <strong>last_start</strong>) // 無重復{dp[i] = dp[i-1] + 1;}}if(dp[i] > maxlen){maxlen = dp[i];maxindex = i + 1 - maxlen;}}output(arr); }

Hash

很多情況下,在描述一個字符串時,都是英文字母組成的字符,因此可能出現(xiàn)的元素是有限的(26個),因此就有了第二種想法,Hash。

這種想法在于使用一個大小為26的數(shù)組visited[]記錄每個字符是否出現(xiàn),然后枚舉最長不重復子串的起點。代碼如下:

void LNRS_hash(char* s){char visited[26];int i, j;int maxlen = 0;int maxIndex;int len = strlen(s);memset(visited, -1, 26);for (i = 0; i < len; i++){visited[s[i] - 'a'] = 1;for(j = i+1 ; j < len; j++){if(visited[s[j]-'a'] == -1) //該字符沒有出現(xiàn){visited[s[j]-'a'] = 1;if(j - i+1> maxlen){maxlen = j - i+1;maxIndex = i;//最長不重復子串的起點}}elsebreak;}memset(visited, -1, 26);}printf("%d\n", maxlen);}


《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的求字符串中最长无重复字符的子串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。