leetcode 838

我发现我非常不擅长解决这种 ummm充满了各种逻辑判断的问题 orz! 因为总是漏少几种情况(很绝望orz)

这道题我是这么判断的

temp为更改后的字符串,dominoes为原字符串

对于原字符串,只需要改变“.”的状态就好了

设置两个指针 low,high

扫描到当前字符“.”时,low从“.”左边往前扫,high从“.”右边往后扫

存在以前几种情况

1. dominoes[high]=='L'&&dominoes[low]!='R'

   需要将“.”变为“L”

2.dominoes[low]=='R'&&dominoes[high]!='L'

   需要将“.”变为“R”

3. dominoes[low]=='.'&&dominoes[high]=='.'

   同时移动low和high

4. dominoes[low]=='L'&&dominoes[high]=='.'

   只需要移动high指针,因为可能之后会出现L这种情况

5. dominoes[low]=='.'&&dominoes[high]=='R'

  只需要移动low指针,因为可能前面会有R这种情况

6. 其他情况,是不需要改变“.”的状态的

最后对改变后的temp字符串考虑两种情况:

1.第一个字符是“.”

2.末尾字符是“.”

给几个特殊样例:

".L.R...LR..L.."
"..R.."
".R........"
".......L.L"
"RRRRRRL..."

"L.L...L.L.LL.L..L..."

代码如下

class Solution {
public:
    string pushDominoes(string dominoes) {
        string temp = dominoes;
        if(dominoes[0]=='.')
        {
            if(dominoes[1]=='L')
                temp[0] = 'L';
        }
        for(int i =1;i<dominoes.length()-1;i++)
        {
            if(dominoes[i]=='.')
            {
                int low = i-1;
                int high = i+1;
                while(low>=0&&high<dominoes.length())
                {
                    if(dominoes[high]=='L'&&dominoes[low]!='R')
                    {
                        temp[i] = 'L';
                        break;
                    }
                    else if(dominoes[low]=='R'&&dominoes[high]!='L')
                    {
                        temp[i] = 'R';
                        break;
                    }
                    else if(dominoes[low]=='.'&&dominoes[high]=='.')
                    {
                        low--;
                        high++;
                    }
                    else if(dominoes[low]=='L'&&dominoes[high]=='.')
                    {
                        high++;
                    }
                    else if(dominoes[low]=='.'&&dominoes[high]=='R')
                    {
                        low--;
                    }
                    else
                        break;
                }
            }
        }
        if(dominoes[dominoes.length()-1]=='.')
        {
            int low = dominoes.length()-2;
            while(low>=0)
            {
                if(temp[low]=='.')
                    low--;
                else
                    break;
            }
            if(temp[low]=='R')
            {
                for(int i =low+1;i<dominoes.length();i++)
                    temp[i] ='R';
            }
        }
        if(dominoes[0]=='.')
        {
            int high = 1;
            while(high<dominoes.length())
            {
                if(temp[high]=='.')
                    high++;
                else
                    break;
            }
            if(temp[high]=='L')
            {
                for(int i =high-1;i>=0;i--)
                    temp[i] ='L';
            }
        }
        return temp;
    }
};

如果大家对我的代算法思路有什么改进,欢迎评论区留言!

原文地址:https://www.cnblogs.com/jzcbest1016/p/9106059.html