/* QUESTION--
//http://www.careercup.com/question?id=16392679
The problem is given a string s1= "ABCDBCCDABCD". and a pattern "BC". we have to replace this pattern with other string ("UVW" or "U"or "uv"). Do this without creating new string.
Take the case to replace "BC" with following
a) "uvw" s1=AUVWDUVWCDAUVWD .
b) "U" s1=AUDUCDAUD .
c) "UV" s1=AUVDUVCDAUVD .
*/
/*Explaination
USING THE KMP algo the times of occurence and position of given pattern in the text then stored the position of the pattern in two arrays (array a and array b )
for e.g text="Chandan"
pat="an";
replace="QQQ";
then a[0]=2,a[1]=5 and b[0]=3,b[1]=6
array containing the position of starting index postion of pattern and array b contain the ending position of the pattern .
now if using the KMP algo count the number of occurence of pattern in text.
and resize the string
if(len_pattern
new_length=len_txt+count*(len_pattern-len_replace)
else there is no need to resize the string .
*/
#include
#include
#include
int a[400];//ARRAYS TO STORE THE POSITION OF THE PATTERN IN THE STRING
int b[400];
int q=0,p=0;
void computeLPSArray(char *pat, int M, int *lps);
int KMPSearch(char *pat, char *txt)
{
int count=0;
int M = strlen(pat);
int N = strlen(txt);
// create lps[] that will hold the longest prefix suffix values for pattern
int *lps = (int *)malloc(sizeof(int)*M);
int j = 0; // index for pat[]
// Preprocess the pattern (calculate lps[] array)
computeLPSArray(pat, M, lps);
int i = 0; // index for txt[]
while(i < N)
{
if(pat[j] == txt[i])
{
j++;
i++;
}
if (j == M)
{
count++;
//printf("%d\n", i-j);
a[q]=i-j;
b[p]=(i-j+M-1);
//printf("%d %d\n",a[q],b[p]);
q++,p++;
j = lps[j-1];
}
// mismatch after j matches
else if(pat[j] != txt[i])
{
// Do not match lps[0..lps[j-1]] characters,
// they will match anyway
if(j != 0)
j = lps[j-1];
else
i = i+1;
}
}
return count;
//free(lps); // to avoid memory leak
}
void computeLPSArray(char *pat, int M, int *lps)
{
int len = 0; // lenght of the previous longest prefix suffix
int i;
lps[0] = 0; // lps[0] is always 0
i = 1;
// the loop calculates lps[i] for i = 1 to M-1
while(i < M)
{
if(pat[i] == pat[len])
{
len++;
lps[i] = len;
i++;
}
else // (pat[i] != pat[len])
{
if( len != 0 )
{
// This is tricky. Consider the example AAACAAAA and i =7.
len = lps[len-1];
// Also, note that we do not increment i here
}
else // if (len == 0)
{
lps[i] = 0;
i++;
}
}
}
}
int main()
{
char txt[500],pat[500],replace[100];
scanf("%s",txt);
scanf("%s",pat);
scanf("%s",replace);
int len_txt=strlen(txt);
int len_pat=strlen(pat);
int len_replace=strlen(replace);
int count=KMPSearch(pat, txt);
int i,j,k,new_length;
if(len_replace>=len_pat)
{
int increase_size=(len_replace*count)-(count*len_pat);
new_length=len_txt+increase_size;
txt[new_length];
p=p-1;
j=new_length-1;
for(i=len_txt-1;i>=0;i--)
{
if(p>=0&&b[p]==i)
{
k=len_replace-1;
while(k>=0)
{
txt[j]=replace[k];
k--;
j--;
}
p--;
i=i-len_pat+1;
}
else
{
txt[j]=txt[i];
j--;
}
}
printf("%s",txt);
}
else
{
int size=q-1;
int decrease_size=(count*len_pat)-(count*len_replace);
new_length=len_txt-decrease_size;
j=0;
q=0;
for(i=0;i
{
if(q<=size&&a[q]==i)
{
k=0;
while(k
{
txt[j]=replace[k];
k++;
j++;
}
q++;
i=i+len_pat-1;
}
else
{
txt[j]=txt[i];
j++;
}
}
txt[j]='\0';
printf("%s",txt);
}
return 0;
}
No comments:
Post a Comment