给定一个字符串S
和一个单词字典 words
,问, words
中一共有多少个单词words[i]
是字符串S
的子序列?
注意, 子序列不同于子串, 子序列不要求连续.
样例
样例 1:
输入: S = "abcde", words = ["a", "bb", "acd", "ace"]
输出: 3
解释: words内有三个单词是S的子串: "a", "acd", "ace".
样例 2:
输入: S = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
输出: 2输入: S = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
输出: 2
注意事项
- 所有
words
内的单词和S
只包含小写字母. S
的长度在[1, 50000]
范围内.words
的长度在[1, 5000]
范围内.words[i]
的长度在[1, 50]
范围内.
本篇文章代码只是提供参考,不保证输入输出完全一致,欢迎评论讨论
package com.test.bi;
import java.util.Scanner;
public class StrWords {
public static void main(String[] args) {
String str = new Scanner(System.in).nextLine();
String wordsStr = new Scanner(System.in).nextLine();
String[] words = wordsStr.split(",");
int sum = 0;
for (int i = 0; i < words.length; i++) {
int indx = contrast(str,words[i]);//做字符串的匹配,如果能匹配到则返回1,否则返回0
if (indx == 1){
sum++;
}
}
System.out.println(sum);
}
private static int contrast(String str, String word) {
int i = 0;
int j = 0;
/*for (int i = 0; i < str.length(); i++) {//推荐使用while循环,结构更加简单
if (j < word.length()){//需要判断是否超出单词的长度,如果超出则结束循环
if (str.charAt(i) == word.charAt(j)){
j++;
}
}else {
break;
}
}*/
while (i < str.length() && j < word.length()){
if (str.charAt(i) == word.charAt(j)){
j++;
}
i++;
}
if (j == word.length()){
System.out.println(word);
return 1;
}else {
return 0;
}
}
}
测试结果