1、ALI字符串
给定一个字符串,判断是否为“ali”型字符串。
字符串满足以下条件:
字符串仅包含a、l、i三种字母, (包括大写和小写);
字符串的开头为仅包含a或者“A"的连续子串;
在该子串后面,为仅包含l或者L的连续子串;
在该子串后面,为仅包含i或者I的连续子串,该子串结束后将直接到达字符串的结尾
用例:
输入AAaLlLLiili,输出Yes;
输入aAiIlL,输出No;
输入alIali,输出No。
实现(AC)
问题看起来简单,实现方法不同的话会出现很多小问题。一开始实现的时候考虑使用三个布尔变量来记录每个字符出现与否,但实现时会发现第一次读入字符时对于布尔变量的设计会比较麻烦。而后更换成利用三个整形记录每个字符出现的次数。值得注意的是,我们仅考虑 “A” 先出现,而后 “L” 出现、“I” 出现的情况,因此若出现字符重复出现或者不出现的情况均不会记录。最终我们只需要检查是否所有变量均不为零且总长度等于字符串总长度即可。
2、修改 01 字符串
给定一个只包含01的字符串,例如0101,每次操作都只能将相邻两位数字进行取反,求找到将字符串转化为尽可能多的1的字符串的最小操作数。
用例:
输入0101,输出2。
0101——1001——1111
输入101,输出0。
无论怎么操作,字符串中最多出现两个1,因此最少次数为0。
实现(30%)
考试的时候想使用 BFS + 哈希堆去重的方法进行遍历,但一直没有写出来。考完之后看到别人的做法:
- 若字符串中出现 0 的个数为偶数,则肯定可以将所有 0 都转为 1 。例如 1001 中,两个 0 之间距离为 0 ,因此只需要一次操作即可全部转化为 1 。例如在 10101 中,两个 0 之间距离为 1 ,因此一共需要两个操作,即先转化为 11001 ,而后转化为 11111 。因此我们显然可以发现,我们只需要遍历字符串中所有的 0 ,而后统计其与下一个 0 之间的距离加一即为将当前两位转化为 1 的最小操作数;
- 若字符串中出现 0 的个数为奇数,则肯定存在一个 0 无法转化为 1 。因此我们可以遍历字符串中个每一个可能的 0 ,选择不将其转化为 0 并