Skip to content

字符串整理

题目描述

  • 给你一个由大小写英文字母组成的字符串 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 = ""

解题思路

  1. 轮询检查相邻字符。

  2. 处理相同字符串。

作答模板

  • 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(""));
    }
}