zoukankan      html  css  js  c++  java
  • 648. Replace Words(LeetCode)

    In English, we have a concept called root, which can be followed by some other words to form another longer word - let's call this word successor. For example, the root an, followed by other, which can form another word another.

    Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor in the sentence with theroot forming it. If a successor has many roots can form it, replace it with the root with the shortest length.

    You need to output the sentence after the replacement.

    Example 1:

    Input: dict = ["cat", "bat", "rat"]
    sentence = "the cattle was rattled by the battery"
    Output: "the cat was rat by the bat"
    

    Note:

    1. The input will only have lower-case letters.
    2. 1 <= dict words number <= 1000
    3. 1 <= sentence words number <= 1000
    4. 1 <= root length <= 100
    5. 1 <= sentence words length <= 1000
       1 class Solution {
       2 public:
       3     string replaceWords(vector<string>& dict, string sentence) {
       4         if (sentence.size() == 0 || dict.size() == 0)
       5             return sentence;
       6         stringstream ss(sentence);
       7         vector<string> vet;
       8         string str;
       9         while (ss >> str)
      10         {
      11             vet.push_back(str);
      12         }
      13         for (int i = 0; i < vet.size(); i++)
      14         {
      15             for (int j = 0; j < dict.size(); j++)
      16             {
      17                 /*cout << vet[i] << vet[i].size() << " " << dict[j] << dict[j].size() << "  22" << vet[i].substr(0, dict[j].size()) << endl;*/
      18 
      19                 if (vet[i].size() >= dict[j].size() && vet[i].substr(0, dict[j].size()) == dict[j])
      20                 {
      21                             vet[i] = dict[j];    
      22                             /*cout <<"11111111"<< vet[i] << endl;*/
      23                 }
      24             }
      25         }
      26         string str1 = "";
      27         for (int i = 0; i < vet.size(); i++)
      28         {
      29             str1 += vet[i];
      30             if (i != vet.size()-1)
      31             str1 += " ";
      32 
      33         }
      34         return str1;
      35     }
      36 };

      别人用字典树做的如下:

       1 class Solution {
       2 private:
       3     class TrieNode{
       4         public:
       5         bool eow;
       6         vector<TrieNode*> chars;
       7         TrieNode():eow(false), chars(vector<TrieNode*>(26,NULL)){
       8             
       9         }
      10     };
      11     
      12     class Trie{
      13         public:
      14         TrieNode* head;
      15         
      16         Trie():head(new TrieNode()) {}
      17         
      18         bool isWord(string str){
      19            TrieNode* cur = head;
      20             for (int i = 0; i < str.size(); i++){
      21                 char c = str[i];
      22                 int index = (c-'a') %26;
      23                 if (cur->chars[index] == NULL){
      24                     return false;
      25                 }
      26                 cur = cur->chars[index];
      27                 if (index == str.size() - 1){
      28                     return cur->eow;
      29                 }
      30             }
      31         }
      32         
      33         void insertWord(string str){
      34             TrieNode* cur = head;
      35             for (int i = 0; i < str.size(); i++){
      36                 char c = str[i];
      37                 int index = (c-'a') %26;
      38                 if (cur->chars[index] == NULL){
      39                     cur->chars[index] = new TrieNode();
      40                 }
      41                 cur = cur->chars[index];
      42                 if (i == str.size() - 1){
      43                     cur->eow = true;
      44                 }
      45             }
      46         }
      47         
      48         string getShortestPrefix(string str){
      49             TrieNode* cur = head;
      50             for (int i = 0; i < str.size(); i++){
      51                 char c = str[i];
      52                 int index = (c-'a') %26;
      53                 if (cur->chars[index] == NULL){
      54                     return str;
      55                 }
      56                 if (cur->chars[index]->eow){
      57                     return str.substr(0,i+1);
      58                 }
      59                 cur = cur->chars[index];
      60             }
      61             return str;
      62         }
      63     };
      64 public:
      65     string replaceWords(vector<string>& dict, string sentence) {
      66         Trie trie;
      67         for (string str : dict){
      68             trie.insertWord(str);
      69         }
      70         
      71         string ans = "";
      72         int index = 0, beg = 0;   
      73         while ((index = sentence.find(' ',beg)) != string::npos){
      74             ans += trie.getShortestPrefix(sentence.substr(beg, index - beg)) + " ";
      75             beg = index + 1;
      76         }
      77         ans += trie.getShortestPrefix(sentence.substr(beg));
      78         return ans;
      79     }
      80 };
  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/wujufengyun/p/7376233.html
Copyright © 2011-2022 走看看