- 论坛徽章:
- 0
|
本帖最后由 dextercu 于 2013-08-22 02:55 编辑
才发现我的解法是错的,因为有10001这样的情况。
我觉得正确的解法是,扫描一遍数组,记下到目前为止多出的1的数目,把结果记在一个数组里,这个结果数组中 最大的 相同数字的跨度就是最长的01字符串。- #include <iostream>
- #include <map>
- #include <algorithm>
- #include <map>
- using namespace std;
- string les(const string & str) {
- int* table = new int[str.size() + 1];
- table[0] = 0;
- for (int i = 0; i < str.size(); i++)
- table[i + 1] = table[i] + (str[i] == '1' ? 1 : -1);
- map<int, int> m;
- int begin = 0, end = 0, longest = 0;
- for (int i = 0; i <= str.size(); i++) {
- pair<map<int,int>::iterator, bool> result = m.insert(pair<int, int>(table[i], i));
- if (!result.second) {
- if (i - m[table[i]] > longest) {
- longest = i - m[table[i]];
- begin = m[table[i]];
- end = i;
- }
- }
- }
- delete [] table;
- return str.substr(begin, end - begin);
- }
- int main() {
- string case1 = "10101010";
- string case2 = "1101000";
- string case3 = "0001000100010001000";
- cout << les(case1) << endl;
- cout << les(case2) << endl;
- cout << les(case3) << endl;
- return 0;
- }
复制代码 |
|