牛牛想知道在一个字符串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";
}
};
京公网安备 11010502036488号