Correspondance de chaînes dans l'arborescence du dictionnaire

sujet

Oh non! Vous avez accidentellement supprimé les espaces et la ponctuation dans un long article, et avez changé les majuscules en minuscules. Une phrase comme "J'ai réinitialisé l'ordinateur. Il n'a toujours pas démarré!" Est devenue "iresetthecomputeritstilldidntboot". Avant de traiter la ponctuation et la mise en majuscules, vous devez la décomposer en mots. Bien sûr, vous avez un dictionnaire épais, mais certains mots ne sont pas dans le dictionnaire. En supposant que l'article est exprimé par une phrase, concevez un algorithme pour casser l'article, exiger les caractères les moins non reconnus et renvoyer le nombre de caractères non reconnus. lien

class Solution {
    
    
    static class Tire {
    
    
        Tire[] next;
        boolean isEnd;

        public Tire() {
    
    
        	//以数组下标表示26个字母
            next = new Tire[26];
        }

        public void insert(String s) {
    
    
            Tire cur = this;
            for (int i = s.length() - 1; i >= 0; i--) {
    
    
            	//对每个单词进行倒序插入,方便后面查找
                int idx = s.charAt(i) - 'a';
                if (cur.next[idx] == null) {
    
    
                    cur.next[idx] = new Tire();
                }
                //循环构建树
                cur = cur.next[idx];
            }
            cur.isEnd = true;
        }
    }

    public int respace(String[] dictionary, String sentence) {
    
    
        Tire root = new Tire();
        for (String s : dictionary) {
    
    
            root.insert(s);
        }
        
        int len = sentence.length();
        //dp[i]表示sentence中以第i个字母为止
        //未匹配的字符数
        int[] dp = new int[len + 1];
        
        for (int i = 1; i <= len; i++) {
    
    
        	//初始dp[i]为前一个字符处未匹配的个数加一
            dp[i] = dp[i - 1] + 1;
            //从根开始查找
            Tire cur = root;
			//以当前字符结尾开始向前查找
            for (int j = i; j >= 1; j--) {
    
    
            	//通过字符确定next数组下标
                int idx = sentence.charAt(j - 1) - 'a';
                //没有字符匹配跳出循环
                if (cur.next[idx] == null) {
    
    
                    break;
                }//查找到末尾, 
                else if (cur.next[idx].isEnd) {
    
    
                	//dp[j-1]处为匹配完一个单词后,再往前一个字符
                	//所以比较当前未匹配字符数和dp[j-1]处未匹配字符数
                    dp[i] = Math.min(dp[i], dp[j - 1]);
                }
                //否则继续向下查找
                cur = cur.next[idx];
            }
        }
		//最后一个字符未匹配的个数
        return dp[len];
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_42007742/article/details/107223639
conseillé
Classement