思路都在注釋裡了
public
intlengthoflongestsubstring
(string s));
//判斷str是否存在於tempstr中
if(tempstr.
contains
(str)
)//儲存重複字元
int reindex = tempstr.
indexof
(str)
;// 刪除tempstr中的重複位元組及其之前的字元
for(
int j=
0;j<=reindex;j++)}
//將當前字元存入tempstr中
tempstr.
add(str);}
//最終判斷
if(tempstr.
size()
> maxstr.
size()
)//返回最長字串的長度
return maxstr.
size()
;}return0;
}
參考了leetcode的題解,思路很清晰,用了滑動視窗。
模擬了乙個最大長度為給定單詞長度之和的滑塊(words.length * len)。讓滑塊在字串s上滑動,通過判定滑塊捏的字元是否匹配給定單詞來儲存下標。 然後做了一些優化處理。
1.首先我快取了所有words中個word 在字元s中的下標。在後續比較中直接比較map,減少迴圈次數。
2.滑塊每次滑動的長度為單詞的長度 len。這樣滑塊中間的資料不用重複比較。滑塊分別從下標 0 到len-1共迴圈滑動 len次。
3.下標為0時,滑塊判定的資料為 0, len , 2 * len, 3*len…
4.下標為1時,滑塊判定的資料為 1,len +1, 2 len+1 ,3len+1…
5.迴圈構建滑塊,從map中快取在下標開始構建,當滑動到不在map中的單詞時,銷毀滑塊。直到下乙個有效下標重新構建。
6.在滑動滑塊的過程中,記錄滑塊內有效的單詞個數 flagnum.每次滑動後。7.如果有效的單詞個數與總單詞個數相同,時滑塊內的資料就是我們所要的。
public
static list
findsubstring
(string s, string.
.. words)
char
tem = word.
tochararray()
;while
((idx =
indexof
(schars, schars.length, tem, len, idx +1)
)>-1
) wordmap.
put(word,1)
;}string word;
int slidelen = len * words.length;
// 滑塊長度
int n;
// 臨時變數
maptemwordmap =
newhashmap
<
>()
;for
(int k =
0; k < len; k++
)// 滑塊長度增加 在尾部新增
word = idxmap.
get(j)
; n = temwordmap.
get(word)-1
; temwordmap.
put(word, n);if
(n >=0)
flagnum++;if
(j - i >= slidelen)
if(flagnum == words.length)
list.
add(i);}
else}}
return list;
}
應用了滑動視窗public
intbalancedstring
(string s)
if(q==w && w==e && e==r)
return0;
cur=0;
while
(curcur++;}
return res;
}
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構 資料結構與演算法02
1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...