当前位置: 首页 > article >正文

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"]
输出:[]
以下程序实现了这一功能,请你填补空白处内容:

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> res = new ArrayList<>();
        if (s == null || s.length() == 0 || words == null || words.length == 0)
            return res;
        HashMap<String, Integer> map = new HashMap<>();
        int one_word = words[0].length();
        int word_num = words.length;
        int all_len = one_word * word_num;
        for (String word : words) {
            map.put(word, map.getOrDefault(word, 0) + 1);
        }
        for (int i = 0; i < one_word; i++) {
            int left = i, right = i, count = 0;
            HashMap<String, Integer> tmp_map = new HashMap<>();
            while (right + one_word <= s.length()) {
                String w = s.substring(right, right + one_word);
                right += one_word;
                if (!map.containsKey(w)) {
                    count = 0;
                    left = right;
                    tmp_map.clear();
                } else {
                    tmp_map.put(w, tmp_map.getOrDefault(w, 0) + 1);
                    count++;
                    while (tmp_map.getOrDefault(w, 0) > map.getOrDefault(w, 0)) {
                        ______________________;
                    }
                    if (count == word_num)
                        res.add(left);
                }
            }
        }
        return res;
    }
}

解答思路:

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

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

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


http://www.kler.cn/a/306479.html

相关文章:

  • 自由学习记录(21)
  • OCR识别铁路电子客票
  • python: postgreSQL using psycopg2 or psycopg
  • python购物计算 2024年6月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析
  • request爬虫库的小坑
  • Matlab: 生成对抗网络,使用Datastore结构输入mat格式数据
  • 物联网——USART协议
  • 揭开OpenAI草莓模型神秘面纱——重塑大语言模型的逻辑能力
  • np.argpartition 是 NumPy 库中的一个非常有用的函数,具体用法如下:
  • 力扣周赛:第415场周赛
  • 黑神话悟空+云技术,游戏新体验!
  • Using OpenAI API from Firebase Cloud Functions in flutter app
  • uniapp(H5)设置反向代理,设置成功后页面报错
  • 前端网络请求库:Axios
  • C++初阶学习——探索STL奥秘——vector的模拟实现
  • 20Kg载重30分钟续航多旋翼无人机技术详解
  • 微服务下功能权限与数据权限的设计与实现
  • 差分进化算法(DE算法)求解实例---旅行商问题 (TSP)
  • C语言自定义类型-联合与枚举
  • 无人机视角下落水救援检测数据集
  • Vue学习:props验证的一个小细节“Prop 名字格式”
  • 本专题大纲
  • golang学习笔记16——golang部署与运维全攻略
  • Java高级Day42-Class类
  • Linux——应用层自定义协议与序列化
  • docker 学习笔记