leetcode 127 单词接龙

采用了算是BFS的方法,维护一个队列,其中维护某一次循环中所有需要进行处理的字符串。每当一次循环开始时,首先记录当前队列中元素个数,作为大循环中小循环个数。每一个小循环中,都会对队列中的元素寻找数组中是否有只差一位的字符串,如果有,则将该字符串从数组中删除,并且加入队列。每次大循环开始时将length++,如果遇到目标字符串,则返回当前length,如果某一次大循环结束时,队列为空,则代表无法转换到目标字符串,返回0。贴代码

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) 
    {
        queue<string> tempQue;
        int length = 1;
        tempQue.push(beginWord);
        int sizeTemp;
        while(!tempQue.empty())
        {
            length++;
            //cout<<length<<endl;
            sizeTemp = tempQue.size();
            //cout<<sizeTemp<<endl;
            for(int i = 0 ; i < sizeTemp ; i++)
            {
                string strTemp = tempQue.front();
                tempQue.pop();
                vector<string>::iterator Iter;
                for(Iter = wordList.begin() ; Iter != wordList.end() ; )
                {
                    //cout<<*Iter<<endl;
                    //string temp = *Iter;
                    if(ifDifferOne(strTemp,*Iter))
                    {
                        //cout<<"1"<<endl;
                        if(*Iter == endWord)
                        return length;
                        tempQue.push(*Iter);
                        wordList.erase(Iter);
                    }
                    else
                    Iter++;
                }
            }
        }
        return 0;
    }
    bool ifDifferOne(string& a,string &b)
    {
        int j = 0;
        for(int i = 0 ; i < a.length() ; i++)
        {
            if(a[i]!=b[i])
            j++;
        }
        if(j == 1)
        return true;
        else 
        return false;
    }
};

有向图的做法,感觉是和自己的方法类似的。使用有向图的方式,对每一个字符串,建立修改其中某个字符为*的虚拟节点,并建立一个双向的边。这样以来,只差一个字符的字符串就能通过一个虚拟节点连接起来。之后都是类似的。还有就是通过string到ID的映射减少存储量。贴代码

 1 class Solution {
 2 public:
 3     unordered_map<string,int> wordId;
 4     vector<vector<int>> edge;
 5     int nodeNum = 0;
 6     void addWord(string& word)
 7     {
 8         if(!wordId.count(word))
 9         {
10             wordId[word] = nodeNum++;
11             edge.emplace_back();
12         }
13     }
14     void addEdge(string& word)
15     {
16         addWord(word);
17         int id1 = wordId[word];
18         for(char& it:word)
19         {
20             char temp = it;
21             it = '*';
22             addWord(word);
23             int id2 = wordId[word];
24             edge[id1].push_back(id2);
25             edge[id2].push_back(id1);
26             it = temp;
27         }
28     }
29     int ladderLength(string beginWord, string endWord, vector<string>& wordList) 
30     {
31         for(string& word:wordList)
32         addEdge(word);
33         addEdge(beginWord);
34         if(!wordId.count(endWord))
35         return 0;
36         vector<int> dis(nodeNum,INT_MAX);
37         int beginId = wordId[beginWord];
38         int endId = wordId[endWord];
39         dis[beginId] = 0;
40         queue<int> que;
41         que.push(beginId);
42         while(!que.empty())
43         {
44             int x = que.front();
45             que.pop();
46             if(x == endId)
47             return dis[endId]/2+1;
48             for(int& tempId:edge[x])
49             {
50                 if(dis[tempId] == INT_MAX)
51                 {
52                     dis[tempId] = dis[x]+1;
53                     que.push(tempId);
54                 }
55             }
56         }
57         return 0;
58     }
59 };

 

上一篇:Dijkstra(持续更新中···)


下一篇:「JOI 2021 Final」机器人