好串(线性表)

47 阅读1分钟

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述 
牛牛喜欢跟字符串玩耍,他刚刚学会了一个新操作,将一个字符串x插入另一个字符串y中(包括放在开头和结尾)
牛牛认为如果一个串是好的当这个串能按照如下方法被构造出来:
一开始,有一个空串,然后执行0次或者若干次操作,每次操作将ab插入当前的字符串

根据上面的定义,ab, aabb, aababb都是好串,aab,ba,abbb并不是好串

现在给你一个字符串s,判断s是否是好串
输入描述:
输入一行包含一个字符串,长度不超过50
输出描述:
输出"Good" 或者 "Bad"
示例1
输入
ab
输出
Good

示例2
输入
aab
输出
Bad

示例3
输入
abaababababbaabbaaaabaababaabbabaaabbbbbbbb
输出
Bad

备注:
子任务1:n <= 10
子任务2:n <= 20
子任务3:无限制

思路清晰:首先我们可以肯定的是如果输入的字符串个数是奇数或者第一个字符是' b '的话,那么这个字符串绝对不可能是“好串”,除此之外,判断一个字符串是不是“好串”,先将这个字符串存储在一个数组中,然后我先找到一个' a ',并且对这个' a '的位置记录下来,再去找对应的' b ',如果找到的话,就将它们都变成‘ 0 ’,最后扫描整个数组,如果有不是‘ 0 ’的位置说明这个串不是“好串”,反之则是“好串”!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j,cn=0,indexa,sign;
    char arr[51];
    scanf("%s",arr);   
    for(i=0;i<strlen(arr)-1;i++)
    {
        if(arr[0]=='b'||strlen(arr)%2!=0)
        {
            printf("Bad\n");return 0;      //如果字符串开头是b,或者字符串长度是奇数的话,
                                           //都不是“好串”
        }
        if(arr[i]=='a')
        {
            indexa=i;                      //如果找到一个a,将其位置记下,且作记号
            sign=1;
        }
 
        for(j=i+1;j<strlen(arr);j++)    //从这个作记号的a后面那个字符开始向后搜索
        {
            if(arr[j]=='b'&&sign==1)    //如果找到一个b,那么将之前的a和现在的b都变成'0'
            {
                arr[indexa]='0';
                arr[j]='0';
                sign=0;
                break;                  //继续下一轮寻找
            }
        }
         
    }
    for(i=0;i<strlen(arr);i++)            
    {
        if(arr[i]=='0')            //看一下‘0’的数量
        {
            cn++;
        }
    }    
    if(cn==strlen(arr))            //如果全部是‘0’,是“好串”
    {
        printf("Good\n");
    }
    else
    {
        printf("Bad\n");            //反之不然
    }
    return 0;
 }

下面给出其他的思路:

(1)转化为计数问题

#include<stdio.h>
int main()
{
	char arr[55];
	gets(arr);
	int i=0,sum=0;
	for(i=0;arr[i]!='\0';i++)
	{
		if(arr[i]=='a')
			sum++;
		else
			sum--;
		if(sum<0)
			break;
	}
	if(sum==0)
		printf("Good");
	else 
		printf("Bad");
	return 0;
}

(2)转化为栈

思路:考察了对栈的理解运用:只要遇到a就入栈,遇到b就让a出栈
,如果此时出现栈空则返回false,最后检查一下如果栈不为空也返回false
代码:

#include <iostream>
#include <stack>
#include <algorithm>

using namespace std;

string str;
stack<char> stk;

int main()
{
    cin >> str;

    bool flag = true;
    for (int i = 0; i < str.size(); i ++ )
    {
        if (str[i] == 'a') stk.push('a');
        else
        {
            if (stk.empty())
            {
                flag = false;
                break;
            }
            stk.pop();
        }
    }
    if (!stk.empty()) flag = false;

    if (flag) cout << "Good" << endl;
    else cout << "Bad" << endl;

    return 0;
}