LeetCode 854. 相似度为 K 的字符串

LeetCode 854. 相似度为 K 的字符串
LeetCode 854. 相似度为 K 的字符串_第1张图片
广度优先搜索

没有剪枝 超时

class Solution {
public:
    int bfs(string& begin, string& end)
    {
        int n = begin.size(), m = end.size();
        if(n != m) return -1;
        if(begin == end) return 0;

        queue<string> q;
        unordered_set<string> st;
        q.push(begin);
        st.insert(begin);

        int res = 0;
        while(q.size())
        {
            int k = q.size();
            while(k --)
            {
                string cur = q.front(); q.pop();
                if(cur == end) return res;
                for(int i = 0; i < n; i ++)
                    for(int j = i + 1; j < n; j ++)
                    {
                        if(cur[i] == cur[j]) continue;
                        string ne = cur;
                        swap(ne[i], ne[j]);
                        if(st.count(ne)) continue;
                        st.insert(ne);
                        q.push(ne);
                    }
            }
            res ++;
        }
        return -1;
    }
    int kSimilarity(string s1, string s2) {
        return bfs(s1, s2);
    }
};

主要是这段代码时间复杂度高

for(int i = 0; i < n; i ++)
   for(int j = i + 1; j < n; j ++)
   {
      if(cur[i] == cur[j]) continue;
      string ne = cur;
      swap(ne[i], ne[j]);
      if(st.count(ne)) continue;
      st.insert(ne);
      q.push(ne);
    }

剪枝优化

class Solution {
public:
    vector<string> getNext(string& s1, string& s2)
    {
        int i = 0, n = s1.size();
        while(i < n && s1[i] == s2[i]) i ++;
        vector<string> res;
        for(int j = i + 1; j < n; j ++)
        {
            //当前字符串字母与最终字符串位置字符相同则部交换,当前字符串的i, j位置字符相同也不交换
            if(s1[j] == s2[i] && s1[j] != s2[j]) 
            {
                swap(s1[i], s1[j]);
                res.push_back(s1);
                swap(s1[i], s1[j]);
            }
        }
        return res;
    }
    int bfs(string& begin, string& end)
    {
        int n = begin.size(), m = end.size();
        if(n != m) return -1;
        if(begin == end) return 0;

        queue<string> q;
        unordered_set<string> st;
        q.push(begin);
        st.insert(begin);

        int res = 0;
        while(q.size())
        {
            int k = q.size();
            while(k --)
            {
                string cur = q.front(); q.pop();
                if(cur == end) return res;
                
                for(auto&& s : getNext(cur, end))
                {
                    if(st.count(s)) continue;
                    st.insert(s);
                    q.push(s);
                }
                              
            }
            res ++;
        }
        return -1;
    }
    int kSimilarity(string s1, string s2) {
        return bfs(s1, s2);
    }
};

你可能感兴趣的:(算法,leetcode,算法,BFS)