• 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过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

  • 相关阅读:
    IDEA “xxx is not a function“
    分析Java的两种数据类型
    安装 ELEMENTOR PRO
    Android App屏幕旋转要点
    Flutter For Web实践
    基于单片机加热炉多参数检测和PID炉温系统
    FFmpeg入门详解之18:视频基础概念
    1. vue-sy-admin: 基于vue3+TypeScript的全局过滤器(filters) 封装及示例
    遍历Map集合、修改Map集合中的value值
    看我如何连夜自建网站背刺我的求职对手们
  • 原文地址:https://blog.csdn.net/weixin_69763181/article/details/142244263