c语言算法--栈--字符处理2

给定一个长度为n的字符串s,字符串由小写字母a…z和大写字母A…ZZ组成
小明要对这个字符串进行操作,他会从头到尾检查这个字符串,如果发现:
s[i]是小写字母,s[i+1]是s[i]对应的大写字母(1<=i<=n);
s[i]是大写字母,s[i+1]是s[i]对应的小写字母(1<=i<=n);
就会把s[i],s[i+1]这两个字符都删掉
小明会重复这个操作,直到字符串不再改变
你需要给出处理完成的字符串
输入格式:
第一行一个整数n
接下来一行一个长度为n的字符串s
输出格式:
输出最后处理完成的字符串,有可能是空串
样例输入:
8
AaAAbcCB
样例输出:
AA

int check(char s,char str)
{
	if(s>='a' && s<='z')
	{
		s = s - 32;
		if(str==s)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
	else
	{
		s = s + 32;
		if (str == s)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
}
int main()
{
	int n = 0, top = 0;
	char s[10001], str[100001];
	scanf("%d%s", &n,str+1);
	for(int i = 1;i<=n;i++)
	{
		if(top && check(s[top],str[i])) //栈中非空且返回值为真
		{
			--top;
		}
		else
		{
			s[++top] = str[i];
		}
	}
	for(int i = 1;i<=top;i++)
	{
		printf("%c", s[i]);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boyer-Moore算法是一种字符串匹配算法,用于在一个主串中查找一个模式串的位置。它的优势在于,在某些情况下,它比传统的字符串匹配算法(如KMP算法)更快。 算法的核心思想是尽可能地跳过主串中不可能存在匹配的位置。具体来说,算法分为两个阶段:预处理阶段和匹配阶段。在预处理阶段,算法需要构造两个数组:坏字符规则和好后缀规则。坏字符规则用于处理主串中与模式串不匹配的字符,好后缀规则用于处理模式串中的后缀字符串。 预处理阶段: 1. 对于模式串中的每个字符,记录它在模式串中最后一次出现的位置。 2. 对于模式串中的每个后缀,找到它在模式串中的另一个位置(不包括最后一个字符),使得该位置到模式串结尾的子串是模式串的后缀,并且该子串不是模式串的整个后缀。 3. 如果模式串中不存在好后缀,那么找到模式串中的最长前缀,使得该前缀等于模式串的后缀。 匹配阶段: 1. 从主串中的第一个字符开始,向右扫描。 2. 对于每个字符,从模式串的最后一个字符开始向左扫描,找到第一个不匹配的字符。 3. 根据坏字符规则和好后缀规则,计算下一次需要跳过的位置。 4. 如果模式串的最后一个字符已经匹配,那么找到了一个匹配。 下面是C语言实现的代码示例: ```c #include <stdio.h> #include <string.h> #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) void generate_bad_char_rule(char pattern[], int pattern_len, int bad_char_rule[]) { int i; for (i = 0; i < 256; i++) { bad_char_rule[i] = pattern_len; } for (i = 0; i < pattern_len; i++) { bad_char_rule[(int) pattern[i]] = pattern_len - i - 1; } } void generate_good_suffix_rule(char pattern[], int pattern_len, int good_suffix_rule[]) { int i, j; int prefix_len = pattern_len; good_suffix_rule[pattern_len - 1] = pattern_len; for (i = pattern_len - 2; i >= 0; i--) { if (prefix_len > i + 1 && pattern[i + 1] != pattern[prefix_len - 1]) { prefix_len = pattern_len - good_suffix_rule[pattern_len - prefix_len + i + 1]; } good_suffix_rule[i] = prefix_len + i; for (j = 0; j < i; j++) { if (pattern[j] == pattern[pattern_len - i + j - 1]) { good_suffix_rule[i] = pattern_len - j - 1; } } } } int boyer_moore(char text[], int text_len, char pattern[], int pattern_len) { int i, j; int bad_char_rule[256]; int good_suffix_rule[256]; generate_bad_char_rule(pattern, pattern_len, bad_char_rule); generate_good_suffix_rule(pattern, pattern_len, good_suffix_rule); for (i = pattern_len - 1, j = i; i < text_len;) { if (pattern[j] == text[i]) { if (j == 0) { return i; } i--; j--; } else { i += bad_char_rule[(int) text[i]]; j = pattern_len - 1; } if (i >= text_len) { break; } if (j == -1) { j = pattern_len - 1; } if (good_suffix_rule[j] < pattern_len - j + i) { i += pattern_len - j - 1; j = pattern_len - 1; } } return -1; } int main(int argc, char *argv[]) { char *text = "ABAAABCD"; char *pattern = "ABC"; int text_len = strlen(text); int pattern_len = strlen(pattern); int index = boyer_moore(text, text_len, pattern, pattern_len); if (index >= 0) { printf("Pattern found at index %d\n", index); } else { printf("Pattern not found\n"); } return 0; } ``` 在上面的代码中,`generate_bad_char_rule`函数用于生成坏字符规则,`generate_good_suffix_rule`函数用于生成好后缀规则,`boyer_moore`函数用于实现匹配。在主函数中,我们将一个文本串和一个模式串传递给`boyer_moore`函数,并打印出匹配结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值