Tag Archives: strings

Is this the toughest C++ interview question? Palindrome with strings using O[n^2]

Is this the toughest C++ interview question? Palindrome with strings using O[n^2]

This could easily one of the hardest questions you could be asked in an advanced senior level C++ interview. Here are two attempts o[n^2]

#include
using namespace std;

void longestPalindrome(char *str, int n)

{
int i=0;
int j=0;
int start = 0;
int end = 0;
int range = 0;
int maxstart = 0;
int maxend = 0;

while(i < n && j < n) { start = i; end = j; while((str[start] == str[end]) && (start >=0) && (end <= n)) { if((maxend - maxstart) < (end-start)) { maxend = end; maxstart = start; } end++; start--; } start++; end++; } for(int i = maxstart; i <= maxend; i++) printf("%c", str[i]); } int main() { char * str = "RACECAR"; cout << strlen(str);; longestPalindrome(str,sizeof(str)); //also: based on O(n^2) char a[]="abcdaeeadabb"; char *p,*q,*r,*found; int i=0; int max=0; for(p=a;*p!='\0';p++) { q=p; r=a+strlen(a); while(qmax) {max=i; found=p;}
}
if(q==r) max=max+1;
cout<<"max is: " << max<<*found; return 0; }

HOW DO YOU START A PROFITABLE TRADING BUSINESS? Read more NOW >>>

NOTE I now post my TRADING ALERTS into my personal FACEBOOK ACCOUNT and TWITTER. Don't worry as I don't post stupid cat videos or what I eat!

Is this the toughest C++ interview question? Palindrome with strings

Is this the toughest C++ interview question? Palindrome with strings

This could easily one of the hardest questions you could be asked in an advanced senior level C++ interview. This program has been described as self containing which can find the center of a palindrome and will do it o(n). The algorithm comes from Haskell authored by Johan Jeuring.

#include
#include
#include

// Simple linked list functions
typedef struct Node Node;
struct Node {
int len;
Node* next;
};

Node* insertNode(Node* head, Node* node) {
node->next = head->next;
head->next = node;
return node;
}

Node* createNode(int len) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->len = len;
return newNode;
}

Node* insertNum(Node* head, int len) {
return insertNode(head, createNode(len));
}

void printReverse(Node* node) {
if (node != NULL) {
printReverse(node->next);
printf(“%d “, node->len);
}
}

void printReverseList(Node* head) {
printReverse(head->next);
printf(“\n”);
}

void cleanList(Node* head) {
Node* curr = head;
while (curr != NULL) {
Node* next = curr->next;
free(curr);
curr = next;
}
}

int main(int argc, char* argv[]) {
if (argc < 2) { printf("USAGE: ./pal string\n"); return 0; } char* a = argv[1]; int n = 0; int len = strlen(a); int currTail = 0; // length of the longest tail palindrome Node* centers = createNode(0); centers->next = NULL;
while (n < len) { if (n - currTail != 0 && a[n - currTail - 1] == a[n]) { n++; currTail += 2; continue; } Node* center = centers->next;
insertNum(centers, currTail);
int centerDist = currTail;
while (centerDist != 0 && center != NULL && centerDist – 1 != center->len) {
centerDist–;
insertNum(centers, center->len > centerDist ? centerDist : center->len);
center = center->next;
}
if (centerDist == 0) {
n++;
currTail = 1;
} else {
currTail = center->len;
}
}
Node* center = centers->next;
insertNum(centers, currTail);
while (currTail != 0) {
currTail–;
insertNum(centers, center->len > currTail ? currTail : center->len);
center = center->next;
}
printReverseList(centers);
cleanList(centers);
return 0;
}

HOW DO YOU START A PROFITABLE TRADING BUSINESS? Read more NOW >>>

NOTE I now post my TRADING ALERTS into my personal FACEBOOK ACCOUNT and TWITTER. Don't worry as I don't post stupid cat videos or what I eat!

C++ interview questions on strings with string reversal and tough manipulation

C++ interview questions on strings with string reversal and tough manipulation

Dseadlock
what is deadlock? how to detect if a deadlock has occurred and how to troubleshoot?

String:
Difference between C-strings and string class in C++.
C++ strings are less efficient, but they have more encapsulated functionality. C strings are manipulated by standard functions while C++ string is object-oriented and string is a class. C string is simply an array of characters.
C++ string is a class n hence ny declaration such as string str is declaration of an object str of string class. Thus in built methods add functionality. on the other hand C strings are mere char pointers.
agreed! both answers are correct…good …
string class is a wrapper over c Strings(char arrays)

Given char* func1(char* target, char* substring,char* replacement)
write a c++ code to find the substring in the target and replace the whole substring with the replacement. (hint: replacement can be larger or smaller than the substring.)consider all possible test cases and check.

1) find the starting index of substring
a) can be done by KMP in O(n)
b) brute force O(n*m)

2) replacing
a) if the word to be replaced is larger– then first replace the characters till the length of substring..then use shifting so–> O((l1-l2)*n)
b) if the word to be replaced is small
then just replace snd shift

Can we use extra array for dealing this question?

I think we can just assume the target array have enough memory after ‘\0’
because every replace string work like that or make error

kmp= KMP.c: Implements strstr library function using the Knuth-Morris-Pratt
substring search algorithm.

I made some but it is not KMP or something efficient algorithm but it is easy to write front of interviewer.

int main(int argc, char *argv[])
{

int idx = 0;
char target[100];
char *pTag = target;
char sub[10];
char replace[100];
char *pRpr = replace;
if(argc != 4)
{
cout << "Exit... Bye Bye\n"; exit(1); } strcpy(target, argv[1]); strcpy(sub,argv[2]); strcpy(replace,argv[3]); //Loop until target 0 char * pTg, * pSb, *pRp; pRp = replace; while(pTag != '\0') { pTg = pTag; pSb = sub; while(*pSb != '\0' && *pTg != '\0' && *pTg++ == *pSb++); if(*pSb == '\0' && *(pTg -1) == *(pSb -1)) { while(*pRp != '\0')pRp++; while((*pRp++ = *pTg++) != '\0'); while((*pTag++ = *pRpr++) != '\0'); cout << target << "\n"; return 0; } pTag++; } } #include
using namespace std;

void replace(char *target, char *substring, char *replace);

int main()
{
char target[100] = “MyNameIsGajanan”;
char *substring = “Gajan”, *rep = “AAA”;
//cout << target < n
j = i-> n
k = j -> n
Cheema on December 26, 2009 |Edit | Edit

Oops! I meant O(n^2)
Loop structure will just be nested loops

i = 0 -> n
j = i-> n

Reply to Comment
particularraj on November 12, 2009 |Edit | Edit

My cents:

Building suffix trees is not a bad idea. We can get that in O(nlogn) time.
Reply to Comment
Vishal on November 15, 2009 |Edit | Edit

Take a string

1. Reverse the string
2. XOR with the Original String
3. Find the longest sequence of 0s in the XORed result which will be the corresponding answer

Hi Vishal,

You solution will not work always… You can try it on RACECAR……..
reverse of RACECAR is RACECAR only …. so xoring dem wud giv 0000000 …. which is the longest palindrome … i think vishal’s solution will work for all cases …
Anonymous on November 28, 2009 |Edit | Edit

reverse of RACECAR is RACECAR only …. so xoring dem wud giv 0000000 …. which is the longest palindrome … i think vishal’s solution will work for all cases …
whoami on December 14, 2009 |Edit | Edit

that is an awesome approach.. guess it will work for all cases…
small patch: if XORing is tough for charecters while coding… we can just subtract both the strings charecter by charecter… and then count the max no of consecutive zeros….
Anonymous on January 05, 2010 |Edit | Edit

This won’t work for HTTKNOM
fgh on January 05, 2010 |Edit | Edit

this won’t work for HTTKNOM
Anonymous on January 07, 2010 |Edit | Edit

Stupid solution.

APQP
PQPA

XOR, none are zeroes, but PQP is the longest palindrome.
Reply to Comment
parry on November 15, 2009 |Edit | Edit

start with the first character. try to lookup the same character from the bak. on finding the same character from the back check if the substring is palindrome or not. keep on finding the same character until u reach the index of the first character.

keep on doing the same for all the characters. ….O(n^2)
Anonymous on November 16, 2009 |Edit | Edit

If i’m not mistaken would’nt this be O(n^3)
Reply to Comment
Anonymous on November 16, 2009 |Edit | Edit

Just reverse the string and find the largest substring in both the strings. O(n^2).
Reply to Comment
trey on November 16, 2009 |Edit | Edit

finding the longest substring of the string and it’s reverse won’t work. Consider
abcdefgHELLOWORLDgfedcba The longest palindrome is actually LL, that method would return abcdefggfedcba
Dan on December 15, 2009 |Edit | Edit

the longest palindrome is infact OWO !!
Reply to Comment
gagdeep on November 17, 2009 |Edit | Edit

Keep a current pointer on the second element a(1). place two other pointers at current-1 and current+1. check if curr-1 and curr+1 are equal. then move current pointer ahead. again set curr-1 and curr1 and check for:
If curr is at ith position:
while(i>0)
{
if (curr-1 == curr+1)
{
(curr+1)++;
(curr-1)–;
i–;
}
else break;
}

keep tack of the largest one by storing the value of current for which the length of palindrome was max. also keep track of it’s length for each i. Then u can print the longest palindrome.
gagdeep on November 17, 2009 |Edit | Edit

It’s complexity will be O(n). I have a working code for this. if anybody want.
Anonymous on November 17, 2009 |Edit | Edit

test case: abcddcbe

does it work?
gagdeep on November 17, 2009 |Edit | Edit

No, It doesnot… because i assumed that palindrome will be of odd length…

For this case… place a current ptr and move the curr+ ptr till it goes to the value which is not equal to the current ptr. and then follow the steps above.
Reply to Comment
bala on November 20, 2009 |Edit | Edit

@gagdeep what does the ‘i’ signify ??
Reply to Comment
nalin on November 20, 2009 |Edit | Edit

Can you show the working code by which you arrived O(n)
Reply to Comment
kunalgaind on November 20, 2009 |Edit | Edit

I think we cannot solve this question in less than O(n^3) complexity……..as ideally there are n*n different string that can be created using a string of length n……For example there are 1 string of length n that can be formed from given string and there are 2 string of length n-1 that can be formed using a string of lenght n-1 and there are n string of length 1.

So if you sum it all, there are 1+2+ ……..+ n-1 + n strings = O(n*n)……..

We know how to check for one string in O(n) time, so I think we can just repeat the loop by checking string of length n to 1 and stop whenever we find any palindrome…..

Seriously, I don’t think we can solve this question in less than this time, because we have to check for string of each length and in worst case there might not be any palindrome in string and so we might end up with generating palindrome on length 1 i.e . character itself, if you consider that to be a palindrome…..

Please share your thoughts, I would be happy to hear from anyone….who can help me in improve on this solution………..
Reply to Comment
Thiyanesh on November 20, 2009 |Edit | Edit

maxindex = 1;
maxlen = 1;
for(index = 1 to str.length) {
for(cur = 1 to min(index, abs(str.length – index))) {
if(str[index + cur] == str[index – cur]) {
if(cur < maxlen) continue; maxlen = cur; maxindex = index; } } } May fail for the boundary conditions. But this the logic which i can think of for O(n2) complexity. We need two such code blocks one for even length and one for the odd length. Hence the time complexity is O(n2). O(1) space complexity Reply to Comment kunalgaind on November 20, 2009 |Edit | Edit I am not sure about suffix tree, as I have not read those yet, but I don't think we can solve this question iteratively in less than O(n^3) and I don't think dynamic programming will work too as we cannot use the result that I got in previous iteration because if I have two strings that are palindrome then I cannot say that if I merge both string then those will be palindrome also... Here is my solution using O(n^3) complexity. There are n*n different string that can be created using a string of length n......For example there are 1 string of length n that can be formed from given string and there are 2 string of length n-1 that can be formed using a string of lenght n-1 and there are n string of length 1. So if you sum it all, there are 1+2+ ........+ n-1 + n strings = O(n*n)........ We know how to check for one string in O(n) time, so I think we can just repeat the loop by checking string of length n to 1 and stop whenever we find any palindrome..... Seriously, I don't think we can solve this question in less than this time, because we have to check for string of each length and in worst case there might not be any palindrome in string and so we might end up with generating palindrome on length 1 i.e . character itself, if you consider that to be a palindrome..... Please share your thoughts, I would be happy to hear from anyone....who can help me in improve on this solution........... Reply to Comment kcoder on November 21, 2009 |Edit | Edit A working solution. O(n*n*n) complexity but good for an interview. bool ispalindrome (const char * start, const char * end) { while (start < end) { if (*start != *end) { return false; } start++; end--; } return true; } char * longestPalindrome(const char * str_p) { int len = strlen (str_p); const char * startOfPal = 0; // start of palindrome. const char * endOfPal = 0; // end of palindrome. int maxLenOfPal = 0; // len of palindrome. for (int i = 0; i < len; i++) { for (int j = len-1; j > i; j–)
{
const char * start = str_p + i;
const char * end = str_p + j;

if (ispalindrome(start, end))
{
if ((end – start + 1) > maxLenOfPal)
{
startOfPal = start;
endOfPal = end;
maxLenOfPal = end – start + 1;
}
}
}
}

Reply to Comment
Anonymous on November 21, 2009 |Edit | Edit

Not sure what happened to the white space.

Here is a quick test I used.

const char * str = “testanaradaring”;
char * x = longestPalindrome(str);

if (x)
{
cout << x << endl; } else { cout << "No palindrome found." << endl; } Anonymous on November 23, 2009 |Edit | Edit the simplest way is O(N^2) if applying suffix tree time can be reduced to O(NlogN) asuran on November 23, 2009 |Edit | Edit the simplest way is O(N^2) if applying suffix tree time can be reduced to O(NlogN) Reply to Comment bewnet on November 22, 2009 |Edit | Edit How about this way: 1. define stringbulder variable called sb and an int called numberOfChars and max 2. for each character in the string 3. add the character to sb, and set numberOfChars to 1. 4. for each remaining character in the string 5. append the character to sb and increment numberOfChars by 1. 6. if the character is the same as the character read in step 2, then what we have in sb is a potential palindrom so, call a helper funtion called IsPalindrome with the value in sb as an argument. 7. If step 6 returns true, then add the content of sb to a dictionary with sb as a key and numberOfChars as a value---you can have duplicate checks 8. inner loop ends here 9. if numberOfChars > max then reset max to numberOfChars and clear sb
9. loop to the first loop.
10. Now, all possible palindrome strings are in your dictionary. Return a key with value equal to max.

Note that:
The algorithm generates all possible palindroms but, i think there might be a better way of doing it.

Reply to Comment
anon on November 25, 2009 |Edit | Edit

Longest thread of answers to Longest palindrome finding ๐Ÿ™‚
Reply to Comment
SK on December 23, 2009 |Edit | Edit

could not post the link. google for this. the first link has a good solution

finding-the-longest-palindromic-substring-in-linear-time.
Reply to Comment
Anonymous on January 07, 2010 |Edit | Edit

It’s awesome to see people using suffix tree and O(nlogn) at the same time !!
Anonymous on January 07, 2010 |Edit | Edit

And why not?

There are simpler implementations of suffix tree which are O(nlogn).

Because implementing suffix tree can be so complex, ppl might choose to lose some run time over the possible maintenance headaches.
Reply to Comment
c on February 03, 2010 |Edit | Edit

My suggestion is that any approach of O(n^2) time and O(1) space that can be well explained and you can write working code during an interview would suffice!
Reply to Comment
Ryan on February 25, 2010 |Edit | Edit

This self-contained C program will print out all of the palindrome lengths for all possible centers, and it will do it in O(n) time. It is a port of the algorithm in Haskell authored by Johan Jeuring here: johanjeuring.blogspot.com/2007/08/finding-palindromes.html

#include
#include
#include

// Simple linked list functions
typedef struct Node Node;
struct Node {
int len;
Node* next;
};

Node* insertNode(Node* head, Node* node) {
node->next = head->next;
head->next = node;
return node;
}

Node* createNode(int len) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->len = len;
return newNode;
}

Node* insertNum(Node* head, int len) {
return insertNode(head, createNode(len));
}

void printReverse(Node* node) {
if (node != NULL) {
printReverse(node->next);
printf(“%d “, node->len);
}
}

void printReverseList(Node* head) {
printReverse(head->next);
printf(“\n”);
}

void cleanList(Node* head) {
Node* curr = head;
while (curr != NULL) {
Node* next = curr->next;
free(curr);
curr = next;
}
}

int main(int argc, char* argv[]) {
if (argc < 2) { printf("USAGE: ./pal string\n"); return 0; } char* a = argv[1]; int n = 0; int len = strlen(a); int currTail = 0; // length of the longest tail palindrome Node* centers = createNode(0); centers->next = NULL;
while (n < len) { if (n - currTail != 0 && a[n - currTail - 1] == a[n]) { n++; currTail += 2; continue; } Node* center = centers->next;
insertNum(centers, currTail);
int centerDist = currTail;
while (centerDist != 0 && center != NULL && centerDist – 1 != center->len) {
centerDist–;
insertNum(centers, center->len > centerDist ? centerDist : center->len);
center = center->next;
}
if (centerDist == 0) {
n++;
currTail = 1;
} else {
currTail = center->len;
}
}
Node* center = centers->next;
insertNum(centers, currTail);
while (currTail != 0) {
currTail–;
insertNum(centers, center->len > currTail ? currTail : center->len);
center = center->next;
}
printReverseList(centers);
cleanList(centers);
return 0;
}

Reply to Comment
Anonymous on March 08, 2010 |Edit | Edit

Reverse the string and find biggest substring.
hary on March 08, 2010 |Edit | Edit

Precisely. One moethod is what anonymous quoted. reverse and find the longest common substring. O(n2) method.

Second could be for every possible position in the string find the palindrome and keep track of the max found so far. One also has to take care of odd length and even length strings.
AGain O(n2) method.

Reply to Comment
Anonymous on March 08, 2010 |Edit | Edit

No need for such complex algorithms !!!

I was asked this question, I proposed trying all combination (O(n^2) I think) he looked convinced with that approach.
Reply to Comment
Tarun Phaugat on March 09, 2010 |Edit | Edit

Example:
================
Str1=abcbabcmoms

Str2=abcba

ALGO:
================
1.a take A[i]==A[j] , decrement J– till i
if A[i]==A[j]
take paldromeindex=i
and increment i and decrement j till i=j
RANGE[k]=J-I

1.b sort range and return the longest one

CODE:
================

private string LongestPalindrom(Str S1,int size)
{
int maxrange =0;

For(int i=0;i0;J–)
{
char ch2=s1[j];

IF(CH1==CH2 && i!=j)
{
int range= j-i;
i++;
ch1=s1[i];
}
}

IF(MAXRANGE= pali; j–){
tempRange = j – *begin;
if(str[pali] == str[j]){
pali++;
}else{
tempRange = 0;
if(pali != *begin){
break;
}
}
}
if(*range < tempRange){ *range = tempRange; } } } Reply to Comment O(n^2) on April 11, 2010 |Edit | Edit int main() { char a[]="abcdaeeadabb"; char *p,*q,*r,*found; int i=0; int max=0; for(p=a;*p!='\0';p++) { q=p; r=a+strlen(a); while(qmax) {max=i; found=p;}
}
if(q==r) max=max+1;
std::cout<=0) && (end <= n)) { if((maxEnd - maxStart) < (end-start)) { maxEnd = end; maxStart = start; } end++; start--; } start++; end++; } for(int i = maxStart; i <= maxEnd; i++) printf("%c", str[i]); } implement atoi() // to-do: 1.take the first char in str for signed/unsigned check // 2.check for invalid char in str int my_atoi(const char *str) { int i=0; while ( *str ) { i = (i<<3) + (i<<1) + ((*str) - '0'); ++str; } return i; } class A1 { public: int upper; int lower; A1( int i ) : lower( i ), upper( lower+1 ) { }; }; what is wrong with the above code? when i ran the above code with initial value 10, upper gets initialised but not lower. I tried running the same .the lower doesn't get initialised. can somebody explain why? I guess the names of the member variables appearing on the Initialization list should be in the same order as they appear in the class (declaration). There initialization take place in order of there declaration,,, so by that I mean first upper get initialized and after that lower,, So in the previous questions assuming i to be 10 upper = unknow lower value + 1 // lower = 10 on my pc, lower is initialized (equals i) but not upper But I have no idea about why from c++ primer: the initializer only shows which value to set which member, but the order of initializers has no meaning compiler will set upper first, then lower therfore A1( int i ) : upper( lower+1 ) , lower( i ){ }; // lower = 10; upper = 11 Hey Anonymous, there is a small correction. upper will get initialized first. But at that time the value of lower is unknown. So upper value will be = unknown + 1.So we cant predict that it will be 11. Next lower get initialized with i . so its value will be 10 Always remember the initialization order is 1) Super Class (Based on the inheritance order, not mem init list) 2) Memeber (Based on the order they declared in class, not mem init list) 3) Computation inside the constructor Write a function that would have as input a string,and list of characters to be deleted from the string. How would you reverse the output string? Since there is no restriction to use string class function, strtok() can be used. But if not then do (crude method) F(char* iStr, char* List) { int i = strlen(iStr); int j = 0 ; for( k = 0 ; k < strlen(List) ; k++) for( j = 0 ; j < i ; j++) if(iStr[j] == List[k]) { iStr[j] = iStr[j+1]; iStr[j+1] = ' '; j += 1; } } Complexity O(strlen(List) * strlen(iStr)) string removechar(string in, string remove) { int i=0; int asciiarray[256]; string temp; for (i=0; i<256; i++) asciiarray[i] = 0; for (i=0; i

HOW DO YOU START A PROFITABLE TRADING BUSINESS? Read more NOW >>>

NOTE I now post my TRADING ALERTS into my personal FACEBOOK ACCOUNT and TWITTER. Don't worry as I don't post stupid cat videos or what I eat!