LeetCode.1078-两词出现后的单词(Occurrences After Bigram)
这是小川的第392次更新,第422篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第254题(顺位题号是1078)。给出单词first
和单词second
,以"first second third"
的形式在某些文本中出现,其中second
在first
之后立即出现,third
在second
之后立即出现。
对于每个此类事件,将"third"
添加到答案中,然后返回答案。
例如:
输入:text = "alice is a good girl she is a good student", first = "a", second = "good"
输出:["girl","student"]
输入:text = "we will we will rock you", first = "we", second = "will"
输出:["we","rock"]
注意:
-
1 <= text.length <= 1000
-
文本由空格分隔的单词组成,每个单词由小写英文字母组成。
-
1 <= first.length,second.length <= 10
-
first和second由小写英文字母组成。
02 第一种解法
题目很简单,要求找出在first
、second
出现后紧跟着的第三个单词,而整句话是由空格和单词组成的,直接利用空格切分整句话,变成单词数组,如果数组的当前元素等于first
,且当前元素的下一个元素等于second
,就将当前元素的下下个元素添加进ArrayList
,最后将ArrayList
转为String
数组返回即可。
public String[] findOcurrences(String text, String first, String second) {
List<String> result = new ArrayList<String>();
String[] arr = text.split(" ");
for (int i=0; i<arr.length-2; i++) {
if (first.equals(arr[i]) && second.equals(arr[i+1])) {
result.add(arr[i+2]);
}
}
return result.toArray(new String[result.size()]);
}
03 第二种解法
如果不使用空格拆分,我们也可以采用遍历字符的方式来处理。
三个单词因为是相连的,所以我们使用前两个单词来找,只要能够找到前两个单词组成的子串,往后再找,直到遇到空格,那么就找到了第三个单词,将其截取出来存入ArrayList
即可,处理完后,需要将索引往后移,从第二个单词的位置开始下一次寻找。
public String[] findOcurrences2(String text, String first, String second) {
List<String> result = new ArrayList<String>();
int m = first.length(), i = 0, len = text.length();
while (i < len) {
String tem = first + " " + second + " ";
int index = text.indexOf(tem, i);
if (index == -1) {
break;
}
int start = index+tem.length(), end = start;
while (end < len && text.charAt(end) != ' ') {
end++;
}
if (start < len) {
result.add(text.substring(start, end));
}
i = index + m + 1;
}
return result.toArray(new String[result.size()]);
}
04 小结
算法专题目前已连续日更超过八个月,算法题文章260+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!