CF1569A Balanced Substring 题解

Content

给定一个长度为 \(n\) 且仅包含字符 ab 的字符串 \(s\)。请找出任意一个使得 ab 数量相等的 \(s\) 的子串并输出其起始位置和终止位置。如果不存在请输出 -1 -1

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 1000\)\(1\leqslant n\leqslant 50\)

Solution

不难想到一种很朴素的做法:直接暴力提取出所有 \(s\) 的子串,然后一个一个判断这些子串里头是否有 ab 数量相等的子串。这样做的理论复杂度是 \(\mathcal O(n^3)\),足够通过此题,更何况实际远远达不到这个复杂度。

但是!这里有一种 \(\mathcal O(n)\) 的做法,可以轻松通过此题!

不难想到,如果这个字符串里面既有 a 又有 b 的话,一定可以找到形如 ab 或者 ba 的字符串。于是我们直接扫一遍字符串,看是否有 \(s[i;i+1]\)ab 或者 ba,那么就可以直接输出 \(i\)\(i+1\) 了。当然要特判无解的情况。

Code

namespace Solution {
    string s;
 
    iv Main() {
        MT {
            int n; read(n), cin >> s;
            if((s.find("a") == string :: npos) ^ (s.find("b") == string :: npos)) {puts("-1 -1"); continue;}
            F(int, i, 0, n - 1) if(s[i] != s[i + 1]) {printf("%d %d\n", i + 1, i + 2); break;}
        }
    }
}
posted @ 2021-12-15 21:23  Eason_AC  阅读(41)  评论(0)    收藏  举报