NOJ1143 字母转换

来源:互联网 发布:linux 赋值 命令结果 编辑:程序博客网 时间:2024/06/10 09:03

描述
通过栈交换字母顺序。给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1。输出结果需满足字典序。例如TROT 到 TORT:
[
i i i i o o o o
i o i i o o i o
]

输入
给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。

输出
所有的进栈和出栈序列,输出结果需满足字典序

输入样例
madam adamm bahama bahama long short eric rice

输出样例
[ i i i i o o o i o o i i i i o o o o i o i i o i o i o i o o i i o i o i o o i o ]
[ i o i i i o o i i o o o i o i i i o o o i o i o i o i o i o i i i o o o i o i o i o i o i o i o ]
[ ]
[ i i o i o i o o ]

【分析】
先生成排列,再依次判断。

#include <iostream>#include <algorithm>#include <stack>#include <string>#include <cstring>using namespace std;const int maxn = 100 + 5;char A[maxn];bool isStack(string s1, string s2) {    int len1 = s1.length();    int k1 = 0, k2 = 0;    stack<char> s;    for(int i = 0; i < 2*len1; i++) {        if(A[i] == 'i') s.push(s1[k1++]);        else {            if(s.empty() || s.top() != s2[k2]) return false;            else s.pop(), k2++;        }    }    return true;}int main() {    string s1, s2;    while(cin >> s1 >> s2) {        cout << "[ ";        int len1 = s1.length();        for(int i = 0; i < len1; i++) A[i] = 'i', A[i+len1] = 'o';        do {            if(count(A, A+2*len1, 'i') == len1 && A[2*len1-1] == 'o' && isStack(s1, s2)) {                for(int i = 0; i < 2*len1; i++) cout << A[i] << " ";            }        } while(A[0] == 'i' && next_permutation(A, A+2*len1));        cout << "]" << endl;    }    return 0;}
1 0
原创粉丝点击