given a string, remove all repeated consecutive substring with length 1, then delete substring of length 2 and so on...
Example : string is “abcabeccced”
After removing repeated substring of length 1: “abcababceccced” --> “abcababceced” (2 'c' are removed)
After removing repeated substring of length 2: “abcababceced” --> “abcabceced” (substring “ab” is removed)
and so on...
#include
using namespace std;
bool check ( char *s, int st1, int st2, int size)
{
for ( int i = 0; i le size; i++)
{
if ( s[st1+i] != s[st2+i] )
return false;
}
return true;
}
int main()
{
char s[15] = "abcababceccced";
int length = strlen(s);
int maxlen = length/2;
int match = 0;
for ( int len = 1; len < maxlen;len++)
{
int j = len;
int i = 0 ;
while ( j < length)
{
if (check(s,i,j,len))
{
j +=len;
match++;
}
else
{
if ( match)
{
int temp = i+len;
int k = j;
while ( k < length )
{
s[temp] = s[k];
temp++;
k++;
}
length = length -(match*len);
s[length] = '\0';
match = 0;
i +=len;
j =i+len;
}
else
{
i++;
j++;
}
}
}
if ( match)
{
int temp = i+len;
int k = j;
while ( k < length )
{
s[temp] = s[k];
temp++;
k++;
}
length = length -(match*len);
s[length] = '\0';
match = 0;
i +=len;
j =i+len;
}
length = i+len;
s[length] = '\0';
}
return 0;
}
I am not sure if above code i written can be simplified, but its working fine.
"ababcbccc"
for size of substring len, two index will be, i at start and second j = i+len.
maxlen is half of total size of strng.
For every size of substring from 1 to maxlen.
match with every possible consecutive match. Count it.
If mismatch then shift this value to previous location.and keep reducing the
lenth of string.
i.e. aababc for size 2.
SO at 1 and 5, we get mismatch, so we move c to location 3. So string changed to aabc
If no match found previously then increment both pointer by one.
Example : string is “abcabeccced”
After removing repeated substring of length 1: “abcababceccced” --> “abcababceced” (2 'c' are removed)
After removing repeated substring of length 2: “abcababceced” --> “abcabceced” (substring “ab” is removed)
and so on...
#include
using namespace std;
bool check ( char *s, int st1, int st2, int size)
{
for ( int i = 0; i le size; i++)
{
if ( s[st1+i] != s[st2+i] )
return false;
}
return true;
}
int main()
{
char s[15] = "abcababceccced";
int length = strlen(s);
int maxlen = length/2;
int match = 0;
for ( int len = 1; len < maxlen;len++)
{
int j = len;
int i = 0 ;
while ( j < length)
{
if (check(s,i,j,len))
{
j +=len;
match++;
}
else
{
if ( match)
{
int temp = i+len;
int k = j;
while ( k < length )
{
s[temp] = s[k];
temp++;
k++;
}
length = length -(match*len);
s[length] = '\0';
match = 0;
i +=len;
j =i+len;
}
else
{
i++;
j++;
}
}
}
if ( match)
{
int temp = i+len;
int k = j;
while ( k < length )
{
s[temp] = s[k];
temp++;
k++;
}
length = length -(match*len);
s[length] = '\0';
match = 0;
i +=len;
j =i+len;
}
length = i+len;
s[length] = '\0';
}
return 0;
}
I am not sure if above code i written can be simplified, but its working fine.
"ababcbccc"
for size of substring len, two index will be, i at start and second j = i+len.
maxlen is half of total size of strng.
For every size of substring from 1 to maxlen.
match with every possible consecutive match. Count it.
If mismatch then shift this value to previous location.and keep reducing the
lenth of string.
i.e. aababc for size 2.
SO at 1 and 5, we get mismatch, so we move c to location 3. So string changed to aabc
If no match found previously then increment both pointer by one.
Comments
Post a Comment