牛牛想知道在一个字符串s中是否有两个不重叠的子串"NB"和"BN"。
例如,在一个字符串中出现一个子串为"NBN",那么就是有重叠的。
由于字符串可能会很长,所以牛牛无法解决该问题,所以他想请你帮忙,给定一个字符串s,如果有两个不重叠的子串"NB"和"BN",返回"YES",反之,返回"NO"。

题解:题目本意实际上就是寻找NB和BN这两个字符串,如果不想让他们有重合的话,那么就贪心寻找,先找到第一个NB或BN的index,然后从这个index开始继续寻找BN或NB的index,然后我们就可以根据这四个index来判断是否有出现不重叠的子串了,判断方式为(a != -1 && b != -1) || (c != -1 && d != -1),这里的寻求index的方法用的是c++的find函数,事实上这并不能算是最快的方法,但是对于本题的复杂度来说显然已经足够了。

时间复杂度:STL中的string的find算法用的是朴素的O(n*m)时间复杂度 所以这里为O(2n) 如果用KMP的话可以优化到O(2+n)
空间复杂度:O(1)
参考代码:

class Solution {
public:
    /**
     * 给定一个字符串s,如果有两个不重叠的子串"NB"和"BN",返回"YES",反之,返回"NO"。
     * @param s string字符串 代表题意中的字符串s
     * @return string字符串
     */
    string solve(string s) {
        // write code here
        int len = s.size();
        if (len <= 3)
            return "NO";
        int a = s.find("NB");
        int b = s.find("BN", a + 2);
        int c = s.find("BN");
        int d = s.find("NB", c + 2);
        if ((a != -1 && b != -1) || (c != -1 && d != -1))
            return "YES";
        return "NO";
    }
};