字符串整理
题目描述
- 给你一个由大小写英文字母组成的字符串
s
。
-
一个整理好的字符串中,两个相邻字符
s[i]
和s[i+1]
,其中0<= i <= s.length-2
,要满足如下条件:- 若
s[i]
是小写字符,则s[i+1]
不可以是相同的大写字符。 - 若
s[i]
是大写字符,则s[i+1]
不可以是相同的小写字符。
- 若
- 请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的两个相邻字符并删除,直到字符串整理好为止。
- 返回整理好的字符串。
注意:空字符串也属于整理好的字符串,尽管其中没有任何字符。
- 示例:
# 输入:
str = "HogGgwarts"
# 输出:
str = "Hogwarts"
# 输入:
str = "abBAcC"
# 输出:
str = ""
解题思路
-
轮询检查相邻字符。
-
处理相同字符串。
作答模板
python
模板
def make_string(s):
"""
中间是你要实现的代码
"""
return result
java
模板
public class Solution {
public String makeString(String message) {
// 中间是你要实现的代码
return result;
}
}
参考答案
- python
def makeString(s):
# 定义一个循环控制变量
i = 0
# 因为不确定循环的次数,所以使用while循环,为了防止下标越界问题,所以需要减一
while i < len(s) - 1:
# 通过检查元素的ASCII码来验证两个元素是否是大小写不同的相同字母
if abs(ord(s[i]) - ord(s[i+1])) == 32 :
# 满足条件进行删除操作,因为切片操作是左闭右开的
s = s[:i] + s[i+2:]
# 重置循环变量的值,保证下次循环是从字符串开头开始的
# 为了保证i的值不受循环变量每次改变的值的影响,所以讲i的值置为-1
i = -1
# 控制循环的次数,保证每一次都能往下继续执行
i += 1
return s
if __name__ == '__main__':
print("abBAcC结果为:",makeString("abBAcC"))
print("HogGgwarts结果为:",makeString("HogGgwarts"))
print("空串结果为:",makeString(""))
- java
package 字符串整理;
public class Solution {
public String makeString(String message) {
// 1.使用StringBuilder 来动态删除修改message
StringBuilder str = new StringBuilder(message);
// 定义一个变量,用来接收控制while循环结束的条件,接收长度
int len = -1;
// 因为不确定循环的次数,所以使用while循环
// 需要判断字符串长度是否发生改变
while (len != str.length()){
// 1.记录字符串的遍历前的长度
len = str.length();
// 2.遍历整个字符串中的每一个元素,为了防止下标越界的问题,所以需要进行-1
for (int i =0;i < str.length() -1 ;i++){
// 2.1 检查字符串中相邻的两个字符是否满足删除条件
// 2.1 通过计算两个字符的ASCII码值来判断是否为大小写不同的相同字母
if (Math.abs(str.charAt(i) - str.charAt(i+1)) == 32){
// 2.1.1 满足删除条件,要进行删除操作
// 2.1.1 通过delete方法,删除符合条件的字符
str.delete(i,i+2);
// 2.1.2 删除操作结束后,需要退出for循环,开始下一次的遍历操作
break;
}
}
}
return str.toString();
}
public static void main(String[] args) {
Solution solution = new Solution();
// 测试用例
System.out.println("abBAcC结果为:" + solution.makeString("abBAcC"));
System.out.println("HogGgwarts结果为:" + solution.makeString("HogGgwarts"));
System.out.println("空串结果为:" + solution.makeString(""));
}
}