Java中如何忽略字符串中的重复单词?
实现无重复单词统计(限制仅用基础字符串方法)
以下是符合要求的实现,仅使用charAt、length、substring方法,通过递归+三元运算符替代循环与if语句,完成去重后的单词计数:
public class UniqueWordCounter { public static int countUniqueWords(String s) { String trimmed = trim(s); return trimmed.length() == 0 ? 0 : (() -> { int spacePos = findFirstSpace(trimmed); String firstWord = spacePos == -1 ? trimmed : trimmed.substring(0, spacePos); String remaining = spacePos == -1 ? "" : trimmed.substring(spacePos + 1); // 移除剩余字符串中所有当前单词,并合并连续空格 String cleanedRemaining = collapseSpaces(removeAll(remaining, firstWord)); return 1 + countUniqueWords(cleanedRemaining); })(); } // 递归去除首尾空格 private static String trim(String s) { return s.length() == 0 ? "" : (s.charAt(0) == ' ' ? trim(s.substring(1)) : (s.charAt(s.length()-1) == ' ' ? trim(s.substring(0, s.length()-1)) : s)); } // 递归查找第一个空格的索引,无空格返回-1 private static int findFirstSpace(String s) { return s.length() == 0 ? -1 : (s.charAt(0) == ' ' ? 0 : 1 + findFirstSpace(s.substring(1))); } // 递归移除字符串中所有指定单词 private static String removeAll(String s, String word) { int wordLen = word.length(); return s.length() < wordLen ? s : (s.substring(0, wordLen).equals(word) ? removeAll(s.substring(wordLen), word) : s.charAt(0) + removeAll(s.substring(1), word)); } // 递归合并连续空格为单个空格 private static String collapseSpaces(String s) { return s.length() < 2 ? s : (s.charAt(0) == ' ' && s.charAt(1) == ' ' ? collapseSpaces(s.substring(1)) : s.charAt(0) + collapseSpaces(s.substring(1))); } // 测试示例 public static void main(String[] args) { String testStr = "A long long time ago, I can still remember"; System.out.println(countUniqueWords(testStr)); // 输出 8 } }
实现说明
- 核心逻辑:每次提取当前字符串的第一个单词,移除剩余字符串中所有该单词的实例,递归统计剩余字符串的唯一单词数并加1,直到字符串为空。
- 辅助方法:
trim:递归去除字符串首尾空格,避免空字符串干扰计数。findFirstSpace:递归定位第一个空格的位置,用于分割第一个单词和剩余字符串。removeAll:递归移除所有目标单词,实现去重效果。collapseSpaces:递归合并连续空格,避免移除单词后出现多个连续空格导致分割错误。
- 替代方案:用三元运算符替代if判断,用递归替代循环,完全符合题目限制。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

