字节跳动春招研发部分编程题 1 万万没想到之聪明的编辑

题目链接:万万没想到之聪明的编辑

题目描述:
 聪明的编辑
 拼写错误修改
 1,三个同样的字母连在一起,一定是拼写错误,去掉一个的就好了:比如helllo->hello;
 2,两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二队的一个字母就好了,比如 helloo->hello;
 3,规则优先从左带有匹配,如果是AABBCC,则优先考虑AABB修复,改为AABCC;
 字符串数量 1~50
 每个用例的字符串长度满足1~1000

题目要求:

字节跳动春招研发部分编程题 1 万万没想到之聪明的编辑_第1张图片

 自己的代码:

#include
#include
#include
using namespace std;

/*
 聪明的编辑
 拼写错误修改
 1,三个同样的字母连在一起,一定是拼写错误,去掉一个的就好了:比如helllo->hello;
 2,两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二队的一个字母就好了,比如 helloo->hello;
 3,规则优先从左带有匹配,如果是AABBCC,则优先考虑AABB修复,改为AABCC;
 字符串数量 1~50
 每个用例的字符串长度满足1~1000

*/
string revise_str(string s);

void test1() {
    int str_num;//字符串个数
    cin >> str_num;
    string s;
    vectorstr_vec(str_num);
    for (int i = 0; i < str_num; i++) {
        cin >> s;
        str_vec[i] = revise_str(s);
    }

    for (const auto& st : str_vec) {
        cout << st << endl;
    }

}

string revise_str(string s) {
    int long_str;
    long_str = s.size();
    int flag = 0;
    char sign_char = s[0];
    int j = 0;
    string s1 = " ";
    s1[0] = s[0];
    for (int i = 1; i < long_str; ++i) {
        if (flag == 0) {
            if (s[i] == sign_char)
                flag = 1;
            else
                sign_char = s[i];
        } else if (flag == 1) {
            if (s[i] == sign_char)
                flag = 2;
            else {
                sign_char = s[i];
                flag = 3;
            }
        } else if (flag == 3) {
            if (s[i] == sign_char)
                flag = 4;
            else {
                flag = 0;
                sign_char = s[i];
            }
        }
        if (flag == 2)
            if (sign_char != s[i]) {
                flag = 3;
                sign_char = s[i];
            }
        if (flag == 4)
            if (sign_char != s[i]) {
                flag = 0;
                sign_char = s[i];
            }

       // cout << flag << "\t" << s[i];
       // cout << endl;
        if (flag != 2 && flag != 4) {
            s1 = s1 + s[i];
        }
    }
    return s1;
}

int main() {

    test1();
    return 0;
}

 一些说明: 

test1( )函数,输入字符串个数,输入多行字符串(一个for循环)并修整字符串(revise_str( )函数),输出字符串vector容器(第二个for循环)。

revise_str( )函数:

将读入的字符串s修正变为字符串t,其中 t = " ";表示字符串的动态分配声明,配合t = t+s[i];实现修正字符串的迭代写入。

主体大的for循环用来从s的第二个字符开始遍历,与之前字符tmp开始比较,若相同则计数加1表示连续,用count1变量表示连序相同字符的个数。如果count1为2则表示要求AA格式,flag标识符加1,若不相同,则替换之前的字符tmp为当前字符,count1重置为1;如果在flag为1的情况下,不相同,说明为要求AAB格式,这里采用count2表示在AA格式下不相同的变换次数,如果变换两次,则为AABC格式,那么flag 自减;表示不用剔出字符。并且将count2重置为0;开始下一次计数。

第二个大if else if else 条件用来剔除字符和重置变量;如果count1 = 3;则满足AAA格式;剔除最后一个A,将count1重置为2,即AA格式,如果count1 = 2;并且flag = 2,则为AABB格式,所以要剔除最后一个B,将count1重置为1,flag--,即退化为AAB合适,在其他情况则将是s[i]追加至t的后面,利用t = t+s[i];

最后返回t;

困难:对于AABBCC形式的,应退化为AABCC,这里检测出AA时,flag = 1,count1 = 1,检测出AABB时,flag = 2,count1 = 2;接下来进行剔除,格式为AAB格式,所以flag = 1,count1 = 1;当检测到AABC时,这里利用count2对变化计数,计数为2则表示AA-B-C,变换两次,flag自减为0,不满足剔除定律,当检测到AABCC时,flag = 0,不满足剔除,则实现顺序优先剔除。

讲的可能不清晰,可以细看代码。

 

 

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