首页 > 解决方案 > 在句子/字符串中查找子字符串

问题描述

我试图在一个句子中返回一个单词,该单词具有给定字符串中最常见的字符。

例如:

给定句子:

Old man sneezed at Starbucks.

给定单词:

nee

我想在那句话中返回打喷嚏的词。

我对 Java 很陌生,实际上我是 JS 和 Python 开发人员,所以我对 Char 数组、ArrayList、StringBuilder 等感到非常困惑。

在我看来,

  1. 我需要将给定的句子传递给字符串数组
  2. 将每个元素转换为 char 数组
  3. 在同一个循环中将给定的单词转换为 char 数组
  4. 计算最常出现的单词并返回该索引

但我真的不知道我需要使用什么数组类型。

有人可以用一些可以引导我解决问题的小片段或算法来帮助我。

这就是我开始的方式,但我不觉得这会帮助我完成我正在寻找的东西:

        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

标签: java

解决方案


假设您只想返回第一次出现,您可以修改您的 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]

推荐阅读