java - 在句子/字符串中查找子字符串
问题描述
我试图在一个句子中返回一个单词,该单词具有给定字符串中最常见的字符。
例如:
给定句子:
Old man sneezed at Starbucks.
给定单词:
nee
我想在那句话中返回打喷嚏的词。
我对 Java 很陌生,实际上我是 JS 和 Python 开发人员,所以我对 Char 数组、ArrayList、StringBuilder 等感到非常困惑。
在我看来,
- 我需要将给定的句子传递给字符串数组
- 将每个元素转换为 char 数组
- 在同一个循环中将给定的单词转换为 char 数组
- 计算最常出现的单词并返回该索引
但我真的不知道我需要使用什么数组类型。
有人可以用一些可以引导我解决问题的小片段或算法来帮助我。
这就是我开始的方式,但我不觉得这会帮助我完成我正在寻找的东西:
ArrayList<String> wordArrayList = new ArrayList<String>();
int count = 0;
for(String eachWord : sentence.split(" ")) {
wordArrayList.add(eachWord);
char[] charArray = eachWord.toCharArray();
char[] givenWord = word.toCharArray();
}
感谢大家的时间和关注。
编辑:
我想添加另一个案例来澄清我想要完成的事情:
给定句子:
Up to dubs
给定单词:
bus
返回:
dubs
解决方案
假设您只想返回第一次出现,您可以修改您的 for 循环以迭代句子中的整个单词,而不是使用str 遍历单个字符。split(),并利用str. 包含():。
class Main {
static String findWordThatMatchesSubString(String sentence, String subString) {
for (String word : sentence.split(" ")) {
if (word.contains(subString)) {
return word;
}
}
return null;
}
public static void main(String[] args) {
String sentence = "Old man sneezed at Starbucks.";
String subString = "nee";
String foundWord = findWordThatMatchesSubString(sentence, subString);
if (foundWord != null) {
System.out.println(foundWord);
} else {
System.out.println(subString + " was not found in any word.");
}
}
}
输出:
sneezed
如果您确实需要处理多个匹配项,那么使用ArrayList就像您目前正在做的那样是合适的:
import java.util.ArrayList;
import java.util.List;
class Main {
static List<String> findWordsThatMatchesSubString(String sentence, String subString) {
List<String> wordMatches = new ArrayList<>();
for (String word : sentence.split(" ")) {
if (word.contains(subString)) {
wordMatches.add(word);
}
}
return wordMatches.size() > 0 ? wordMatches : null;
}
public static void main(String[] args) {
String sentence = "Old man sneezed at Starbucks and dropped his knitting needle on the floor.";
String subString = "nee";
List<String> foundWords = findWordsThatMatchesSubString(sentence, subString);
if (foundWords != null) {
System.out.println(foundWords);
} else {
System.out.println(subString + " was not found in any word.");
}
}
}
输出:
[sneezed, needle]
关于您在句子中查找包含所有字符的单词的后续问题,subString
您可以维护字符映射及其计数以实现您想要的结果:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Main {
static List<String> findWordsThatContainAllCharsInSubString(String sentence, String subString) {
List<String> wordMatches = new ArrayList<>();
for (String word : sentence.split(" ")) {
if (containsAllChars(word, subString)) {
wordMatches.add(word);
}
}
return wordMatches.size() > 0 ? wordMatches : null;
}
static boolean containsAllChars(String word, String subString) {
if (word.length() < subString.length()) {
return false;
}
Map<Character, Integer> subStringCharsMap = new HashMap<>();
for (char c : subString.toCharArray()) {
subStringCharsMap.put(c, subStringCharsMap.getOrDefault(c, 0) + 1);
}
for (char c : word.toCharArray()) {
if (subStringCharsMap.containsKey(c)) {
if (subStringCharsMap.get(c) == 1) {
subStringCharsMap.remove(c);
} else {
subStringCharsMap.put(c, subStringCharsMap.get(c) - 1);
}
}
if (subStringCharsMap.size() == 0) {
return true;
}
}
return false;
}
public static void main(String[] args) {
String sentence = "I got a new pair of shoes";
String subString = "hes";
List<String> foundWords = findWordsThatContainAllCharsInSubString(sentence, subString);
if (foundWords != null) {
System.out.println(foundWords);
} else {
System.out.println(subString + " was not found in any word.");
}
}
}
输出:
[shoes]
推荐阅读
- javascript - 仅当字符串文件名具有 .jpg 或 .png 扩展名时才使用正则表达式替换
- javascript - 无法读取未定义的属性“toFixed”
- jmeter - 如何从 Jmeter 报告中删除 check_user_activity 以及如何将 KO 更改为在统计表中失败?
- mysql - Mysql In 运算符,python 格式
- azure - 将文件传输到 Azure 虚拟机的最佳方式是什么?
- java - Elasticsearch:java.lang.OutOfMemoryError 后重启节点:Java 堆空间
- javascript - 如何清理html中的css和js
- elasticsearch - mysql 到 Elasticsearch:按使用选定字段分组和排序
- angular - 类型字符串不可分配给类型编号
- c# - 如何在 Blazor 服务器应用程序中访问 WCF 服务