百题挑战计划—第4题—匹配字典中的最长单词LEETCODE_524(Longest Word in Dictionary through Delecting - M)

题目描述:

	事先给定一个字符串 s 和 一个字符串集合 list,判断 list 中的字符串是不是 s 通过删除字符得到的子字符串,
	若有多个子字符串,则选取最长的一个。
	若有相同长度的,则取字典序最优先的。(在ASCII码中排的前)

思路:
简化问题,把【字符串与字符串集合作比较】简化为【该字符串是不是s的子字符串】,这一步可以通过另写一个方法 isSubString(String s, String target)完成
定义一个 longestWord, 遍历 d ,将每一个 target 与 s 进行 isSubString 比较,
若返回 true,当 target.length() > longestWord.length() ,或 target.length() == longestWord.length() && target.campareTo(longestWord) < 0 时,将 longestWord = target
若返回 false,跳过这次循环
最终返回 longestWord

代码:

private String findLongestWord(String s, List<String> d) {
        String longestWord = "";
        for (String target : d) {
            int l1 = longestWord.length(); int l2 = target.length();
            // 判断 target 是否是 s 的子字符串
            if (isSubStr(s, target)) {
                // target 比 longestWord 长度更长;或者长度相同时,字典序优先
                if (l2 > l1 || (l2 == l1 && target.compareTo(longestWord) < 0)) {
                    longestWord = target;
                }
            }
        }
        return longestWord;
    }

    /**
     * 第一种判断子串方式,双指针法,稍慢
     * @param s
     * @param target
     * @return
     */
    private boolean isSubString(String s, String target) {
        if (target.length() > s.length()) return false;

        int i = 0, j = 0;
        while (i < s.length() && j < target.length()) {
            if (s.charAt(i) == target.charAt(j)) {
                j++;
            }
            i++;
        }
        return j == target.length();
    }

    /**
     * 第二种判断子串方式,稍快
     * @param s
     * @param target
     * @return
     */
    private boolean isSubStr(String s, String target){
        int star = -1;
        for (char c : target.toCharArray()) {
            int index;
            if ((index = s.indexOf(c, star + 1)) == -1) {
                return false;
            }
            star = index;
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值