【Leetcode刷题记录】524. 通过删除字母匹配到字典里最长单词

524. 通过删除字母匹配到字典里最长单词

题目

给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。

示例1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”

解题想法

解题思路其实比较清晰,就是首先对给的待匹配字典的里字符串进行排序,规则就是长的字符串在前,长度一样的按照字典序进行排序,然后就是遍历字典中字符串,返回满足要求的第一个串,个人在实现进行比对判断的时候用了数组空间存s串中的字符的下标然后再遍历比对,后看别人题解,其实此处比多判断用两个指针分别指向s和带判断dictionary[i]就行

未使用双指针

 public static class tComparator implements Comparator<String>{
	        public int compare(String a,String b){
	            if(a.length()!=b.length()) return b.length() - a.length();
	            else{
	                for(int i=0;i<a.length();i++){
	                    if(a.charAt(i)!=b.charAt(i)) return a.charAt(i) - b.charAt(i);
	                }
	            }
	            return 0;//当两个字符串完全相等的时候,返回0

	        }
	    }
	    public String findLongestWord(String s, List<String> dictionary) {
	        
	        
	        List<List<Integer>> sites = new ArrayList<>();
	        for(int i=0;i<26;i++){//还是先初始化一下吧
	            sites.add(i,new ArrayList<>());
	        }
	        for(int i=0;i<s.length();i++){
	            List<Integer> n = sites.get(s.charAt(i)-'a');
	            sites.get(s.charAt(i)-'a').add(i);
	        dictionary.sort(new tComparator());
	        for(int i=0;i<dictionary.size();i++){
	            
	            String sd = dictionary.get(i);

	            List<Integer> path = new ArrayList<>();
	            int j = 0;
	            for(;j<sd.length();j++){
	                int k = sd.charAt(j)-'a';
	                //添加对应的字符的位置,应该是找到count[k]个比当前路径大的位置的字符
	                //int kt = 0;
	                int ks = 0;
	                while(ks<sites.get(k).size()){
	                    if(j-1<0||j-1>=0&&sites.get(k).get(ks)>path.get(j-1)){
	                        break;
	                    }
	                    ks++;
	               
	                    
	                }
	           
	                if(ks>sites.get(k).size()-1) break; //如果满足,退出的时候应该是正好需要的ks的位置        
	                path.add(sites.get(k).get(ks));
	
	            }
	            if(j>=sd.length()){//完成遍历退出,则应该是符合的
	                return sd;
	            }

	        }
	        return "";
	    }

使用双指针

public String findLongestWord(String s, List<String> dictionary) {
        
        dictionary.sort(new tComparator());
       //排好序之后,查找的时候两个指针遍历控制就好了,不用再用额外的数组存信息找,其实实际上是一个意思
       for(int k=0;k<dictionary.size();k++){
           String sd = dictionary.get(k);
           if(sd.length()>s.length()) continue;
           int i=0;//遍历字符串s
           int j=0;//遍历字符串sd
           while(i<s.length()&&j<sd.length()){
                if(s.charAt(i)==sd.charAt(j)){ //当sd中的字符与S的相等时同时更新位置指针
                    i++;
                    j++;
                }
                else i++;//否则只更新s的位置指针
           }
           if(j>=sd.length()) return sd; //表示找到满足要求的结果
       }
        return "";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值