StringBuilder、LastIndexOf和IndexOf
- 首先是StringBuilder,再學習leetcode中使用的最多的是
sb.append()、sb.reverse()以及sb.toString()其中sb.reverse().toString()經常連用
給定兩個字符串 A 和 B, 尋找重復疊加字符串A的最小次數,使得字符串B成為疊加后的字符串A的子串,如果不存在則返回 -1。
舉個例子,A = "abcd",B = "cdabcdab"。
答案為 3, 因為 A 重復疊加三遍后為 “abcdabcdabcd”,此時 B 是其子串;A 重復疊加兩遍后為"abcdabcd",B 並不是其子串。
在本題中用到了誰是誰的子字符串的問題,我一開始想的是使用
charAt(index)這個方法逐個比較字符來判斷是否在A中存在B在本題中學會了使用
sb.LastIndexOf這個函數,通過這個函數,可以很方便的查看A中是否有B,如果沒有就直接返回-1,因此此題就變得簡單了。public class Solution686 { public int repeatedStringMatch(String A, String B) { int i =1; StringBuilder sb = new StringBuilder(); sb.append(A); int blength = B.length(); //該循環是為了讓sb成為超過或者等於B的長度的字符串 while(sb.length()<blength){ sb.append(A); i++; } //然后查看sb中是否存在,倘若sb中不存在,那么sb再拼接上一個A能不能行 //如果還不行,就代表不能成為子字符串 return sb.indexOf(B)==-1?(sb.append(A).indexOf(B)==-1?-1:i+1):i; } }
題目2:758. 字符串中的加粗單詞
給定一個關鍵詞集合 words 和一個字符串 S,將所有 S 中出現的關鍵詞加粗。所有在標簽 和 中的字母都會加粗。
返回的字符串需要使用盡可能少的標簽,當然標簽應形成有效的組合。
例如,給定 words = ["ab", "bc"] 和 S = "aabcd",需要返回 "aabcd"。注意返回 "aabcd" 會使用更多的標簽,因此是錯誤的。
這一題也使用了indexOf,但是添加了,fromIndex這個參數,代表從哪里開始
所以可以先遍歷出所有應該被加粗的地方,然后再根據連續與否,進行添加<b>或者<\b>
public class Solution758 { public String boldWords(String[] words, String S) { boolean[] isBold = new boolean[S.length()]; int n = 0; for(String word : words){ n = S.indexOf(word, 0); while(n!=-1){ for(int i = 0;i<word.length();i++)isBold[n+i] = true; n = S.indexOf(word,n+1); } } StringBuilder sb = new StringBuilder(); if(isBold[0]) sb.append("<b>"); for(int i = 0;i<S.length();i++){ sb.append(S.charAt(i)); if(i==S.length()-1){ if(isBold[i]) sb.append("</b>"); break; } if(isBold[i]&&!isBold[i+1]) sb.append("</b>"); if(!isBold[i]&&isBold[i+1]) sb.append("<b>"); } return sb.toString(); } }
