双指针思想,就和Leetcode392差不多;
但是这个题如果做法不对的话很可能会超时;
下面这不是我AC的代码,我从网上找的别人的代码;只不过是我加了个注释;
#include <iostream>
using namespace std;
char s[1000010];//创建一个比最大字符串长度长的字符数组
int main()
{
int t;cin>>t;
while(t--)
{
//主要是用了一下双指针思想
cin>>s;
int k=0;
for(int i=0;s[i];i++)
{
s[k++]=s[i];
//因为每次是删除一个字符,也就相当于把k向后移动一位
//这样就相当于把第三个字符删去了;因为第二种情况下是删除aabb的最后一个b字符;
//也就是 比如 188899 这样的话就是把第三个8用后面的数值给覆盖了,也就相当于删除了;
// 188 99
if(k>=3&&s[k-1]==s[k-2]&&s[k-2]==s[k-3])k--;
/*
我开始是这样写的
if( s[k]==s[k+1]&&s[k+2]==s[k+3]&&k<strlen(s))
我先说这样写的不好出为什么
1.这样写一定会超时,因为当时我把循环结束的条件从 s[i] 改为 i<strlen(s); 这样就运行超时了
2. 这样写很麻烦,而且还容易出错;反正到了最后我也是没有写出来;
如果有大佬能够这样做出来,希望大佬给我这样做的代码
*/
if(k>=4&&s[k-4]==s[k-3]&&s[k-2]==s[k-1])k--;
}
//因为我们只是覆盖了前面的内容,并不是删除了,所以得加个'\0'来作为结束条件,我不知道为啥string加个'\0',然后输出的就是一个空格,而不是结束的标志;
s[k]='\0';
cout<<s<<endl;
}
return 0;
}