leetcode1408 字符串 字符串匹配问题 做题笔记

题目描述:

给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。

如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 words[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。

示例 1:

输入:words = ["mass","as","hero","superhero"]
输出:["as","hero"]
解释:"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。
["hero","as"] 也是有效的答案。

示例 2:

输入:words = ["leetcode","et","code"]
输出:["et","code"]
解释:"et" 和 "code" 都是 "leetcode" 的子字符串。

示例 3:

输入:words = ["blue","green","bu"]
输出:[]

力扣官方题解代码:

善用了库函数
链接:https://leetcode.cn/problems/string-matching-in-an-array/solutions/1723228/shu-zu-zhong-de-zi-fu-chuan-pi-pei-by-le-rpmt/

class Solution {
    public List<String> stringMatching(String[] words) {
        List<String> ret = new ArrayList<String>();
        for (int i = 0; i < words.length; i++) {
            for (int j = 0; j < words.length; j++) {
                if (i != j && words[j].contains(words[i])) {
                    ret.add(words[i]);
                    break;
                }
            }
        }
        return ret;
    }
}

我的思路:

1. 按顺序依次选中单词

2. 与位于后方的单词依次对比字母

问题:

1. 无法满足["maas","as"],["blue","bu"]等场景下的特殊性

我的代码:

class Solution {
    public List<String> stringMatching(String[] words) {
        List<String> result = new ArrayList<>();
        for(int i=0;i<words.length-1;i++){ // 遍历单词
            // int shorter = (words[i].lenght < words[i+1].length) ? words[i].lenght : words[i+1].length;
            
            for(int j=i+1;j<words.length;j++){ //j指向后方的单词
                String curstring = words[i];      //当前单词
                String comparestring = words[j]; //与之比较的单词
                char[] cur = curstring.toCharArray();
                char[] compare = comparestring.toCharArray();

                if(cur.length > compare.length){
                    int lenest = cur.length;
                    int h = 0;                 //h指向compare的字母
                    for(int k=0;k<lenest;k++){ //k指向cur的字母
                        if(cur[k]==compare[h]){
                            h=h+1;
                        }
                        if(h == compare.length){
                            k=lenest;
                    }
                    }
                    if(h == compare.length){
                        result.add(Arrays.toString(compare)
                                .replace("[", "")
                                .replace("]", "")
                                .replace(", ", ""));
                    }
                }else{
                    int lenest = compare.length;
                    int m = 0;
                    for(int n=0;n<lenest;n++){
                        if(cur[m]==compare[n]){
                            m=m+1;
                        }
                    }
                    if(m == cur.length){
                        result.add(cur.toString());
                    }
                }
            }
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值