• JAVA学习-练习试用Java实现“串联所有单词的子串”


    问题:

    给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

    注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

    示例 1:

    输入:  s = "barfoothefoobarman",  words = ["foo","bar"]
    输出:[0,9]
    解释:从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。输出的顺序不重要, [9,0] 也是有效答案。
    示例 2:

    输入:  s = "wordgoodgoodgoodbestword",  words = ["word","good","best","word"]
    输出:[]
    以下程序实现了这一功能,请你填补空白处内容:

    1. class Solution {
    2. public List findSubstring(String s, String[] words) {
    3. List res = new ArrayList<>();
    4. if (s == null || s.length() == 0 || words == null || words.length == 0)
    5. return res;
    6. HashMap map = new HashMap<>();
    7. int one_word = words[0].length();
    8. int word_num = words.length;
    9. int all_len = one_word * word_num;
    10. for (String word : words) {
    11. map.put(word, map.getOrDefault(word, 0) + 1);
    12. }
    13. for (int i = 0; i < one_word; i++) {
    14. int left = i, right = i, count = 0;
    15. HashMap tmp_map = new HashMap<>();
    16. while (right + one_word <= s.length()) {
    17. String w = s.substring(right, right + one_word);
    18. right += one_word;
    19. if (!map.containsKey(w)) {
    20. count = 0;
    21. left = right;
    22. tmp_map.clear();
    23. } else {
    24. tmp_map.put(w, tmp_map.getOrDefault(w, 0) + 1);
    25. count++;
    26. while (tmp_map.getOrDefault(w, 0) > map.getOrDefault(w, 0)) {
    27. ______________________;
    28. }
    29. if (count == word_num)
    30. res.add(left);
    31. }
    32. }
    33. }
    34. return res;
    35. }
    36. }

    解答思路:

    以下是填补空白处的代码:

    1. String lw = s.substring(left, left + one_word);
    2. left += one_word;
    3. tmp_map.put(lw, tmp_map.getOrDefault(lw, 0) - 1);
    4. count--;

    这段代码的作用是在找到一个符合条件的单词后,将其从临时映射中删除,并将左指针向右移动一个单词的长度。这样可以保证下一次找到的单词是新的,并且不会重复计算已经找到的单词。
    (文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

  • 相关阅读:
    Java审计框架基础
    图扑可视化图表组件之股票数据分析应用
    天翼云实时云渲染,助力打造世界VR产业大会云上之城
    Java Collections.fill()方法具有什么功能呢?
    862. 和至少为 K 的最短子数组 二分+栈思想/双端队列+滑窗
    axis和axis2的一些发布差异(WSDL2Java)
    FFmpeg:打印音/视频信息(Meta信息)
    LNMP搭建
    如何查看yandex文字搜索广告的搜索词?
    测试需求分析
  • 原文地址:https://blog.csdn.net/weixin_69763181/article/details/142244263