leetcode 984. 不含 AAA 或 BBB 的字符串

题目非常简单,上手思路就是创建一个空字符串,然后对字符串加 ‘a’ 还是加 ‘b’ 进行判断。然而就像这篇文章所说的那样,这道题目包含多种情况和大量的边界条件

正如第二种所说的那样:先编写代码,然后通过各种用例/测试/调试对程序进行调整,最后得到似乎正确的代码。这种做题方式毫无疑问将耗费我们大量的时间。而我就是文章中所说的第二种,刚看到这题目时候觉得非常简单,头脑一热上手就写,然后就被之后的不断的修改提交各种安排,结果本来十分钟就能坐完的题花费了三十分钟左右的时间才AC,并且通过之后对自己作对的思路依然模模糊糊。在这里我要做出反思,毕竟对我们来说效率才是关键,我们学习算法的过程正是学习它解决问题的方法和锻炼我们处理问题的逻辑思维能力,因为在一些实战的情况下我们是没有条件多次执行调试的,希望大家能有则改之,无则加勉。现在我们就来一步一步剖析这道题目的处理过程,希望能通过这道题目吸取教训。

先确认前条件/不变式/终止条件/边界条件,然后写出正确的代码

首先看题目条件

1、S 的长度为 A + B,且正好包含 A 个 ‘a’ 字母与 B 个 ‘b’ 字母
2、子串 ‘aaa’ 没有出现在 S 中,
3、子串 ‘bbb’ 没有出现在 S 中。

根据题目条件我们得到:

1、字符串中有A个 “b”, B个 “b”,这个比较简单判断A B的值是否为0,若不为0则向字符串添加字母。
2、字符串中不能出现三个连续的字母。这个条件就需要我们来考虑各种情况,,什么时候改加"a", 什么时候该添加"b" 。
3、另外需要我们注意的是我们解决问题的过程是一个动态的过程,也就是说在我们添加字母的过程中A B的大小是不断变化的, 所以在每次添加之前我们需要判断A B 之间的三种关系: A == B A > B A < B。
(1)如果在A = B的条件下我们可以不断的重复添加一个"a",再添加一个"b"的过程,这样永远不会重复。
(2)在A > B 的时候我们可以先向字符串中添加两个"a",再添加一个"b"(过程中要注意B = 0 的情况,这时要判断A是否为1),根据A和B的大小判断实际加"a" , "b"的个数。
(3)A < B的情况与A > B 的情况类似。

现在我们判断边界条件

在A > B 的时候我们判断之前只有可能是一种状态 A > B,所以我们依然先加两个"a",再加一个"b".
在A = B 的时候我们判断之前可能为A = B 这种情况不会导致三个相同字母相连,但是如果之前是A > B 或者B > A的情况这是我们就要考虑先加A 还是先加B ,
另外我们可以在整个过程中之可能有三种情况的两种,不可能有三种情况同时出现,所以我们可以在一开始就对A B 的大小进行判定,然后给定在A = B情况下先加"a" 还是先加 “b”。当A 和B都为0 的时候终止。
在我们判别边界情况的时候可以使用一些简单的例子表示如:
A = 1 B = 3; A = 3 B = 1; A = 4 B= 4;

代码如下:

class Solution {
    public String strWithout3a3b(int A, int B) {
        if(A == 0 && B == 0) return "";
        String res = "";
        boolean flag = (A > B) ? true : false;
        while(A > 0 || B > 0){
            if(A == B){
                if(flag){
                    for(int i = 0; i < 1 && A > 0; i++){
                        res += "a";
                        A--;
                    }
                    for(int i = 0; i < 1 && B > 0; i++){
                        res += "b";
                        B--;
                    }
                }
                else{
                    for(int i = 0; i < 1 && A > 0; i++){
                        res += "a";
                        A--;
                    }
                    for(int i = 0; i < 1 && B > 0; i++){
                        res += "b";
                        B--;
                    }
                }
            }
            if(A > B){
                for(int i = 0; i < 2 && A > 0; i++){
                    res += "a";
                    A--;
                }
                for(int i = 0; i < 1 && B > 0; i++){
                    res += "b";
                    B--;
                }
            }
            if(A < B){
                for(int i = 0; i < 2 && B > 0; i++){
                    res += "b";
                    B--;
                }
                for(int i = 0; i < 1 && A > 0; i++){
                    res += "a";
                    A--;
                }
                
            }
        }
        return new String(res);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42784951/article/details/86677061