题目:854. 相似度为 K 的字符串
思路:广度优先搜索+记忆化搜索,本质上是状态的转换
class Solution {
public:
int kSimilarity(string s1, string s2) {
queue<string> q{{s1}}; //queue init
unordered_set<string> vis{{s1}}; //记忆状态
int ans = 0; //记录结果,即状态变化次数
while(!q.empty()){ //可遍历状态不为空
int size = q.size();
for(int k=0;k < size;++k){
string temp = q.front();
q.pop();
if(temp == s2){ //如果为最终状态,则返回
return ans;
}
int i;
for(i=0;temp[i]==s2[i];++i){} //将i变到当前状态与最终状态不一致的地方
for(int j=i+1;j<s2.size();++j){
if(temp[j]==s2[i] && temp[j]!=s2[j]){ //如果第j个位置和最终的第i个位置相同
//并且该第j个位置不处于最终状态,则进行交换
swap(temp[j],temp[i]);
if(!vis.count(temp)){ //记忆化搜索
vis.insert(temp);
q.push(temp);
}
swap(temp[i],temp[j]);
}
}
}
++ans;
}
return ans;
}
};