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(); } }