深搜题,注意回溯方式,详细见注释。
#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
string s1, s2; //原字符串,目标字符串
int len; //字符串长度
stack<char> st; //字符栈
vector<char> op; //操作序列
//深搜,idx1表示原字符串索引,idx2表示目标字符串索引
void DFS(int idx1, int idx2)
{
if (idx1 == len && idx2 == len) //匹配完成
{
for (int i = 0; i < op.size(); i++)
cout << op[i] << " ";
cout << endl;
return;
}
//原字符串未搜索完
if (idx1 < len)
{
st.push(s1[idx1]);
op.push_back('i');
DFS(idx1 + 1, idx2);
st.pop();
op.pop_back();
}
//目标字符串未搜索完,且目标字符串当前字符和栈顶字符相同
if (idx2 < len && !st.empty() && s2[idx2] == st.top())
{
char temp = st.top();
st.pop();
op.push_back('o');
DFS(idx1, idx2 + 1);
st.push(temp);
op.pop_back();
}
}
int main()
{
while (cin >> s1 >> s2)
{
len = s1.size();
cout << '[' << endl;
DFS(0, 0);
cout << ']' << endl;
}
return 0;
}
继续加油。
本文深入探讨了深度优先搜索(深搜)算法及其在字符串匹配中的应用,通过一个具体的例子展示了如何使用深搜和回溯的方式进行字符串匹配,包括如何利用字符栈和操作序列来实现这一过程。
1万+

被折叠的 条评论
为什么被折叠?



