Finding the Longest Palindrome

The other day I was doing a programming challenge that required me to find the longest palindrome within a string. The challenge was to do it in at least O(N)2 complexity.  I found this to be fairly interesting. The challenge read like so:

Given a string S, find the longest substring in S that is the same in reverse and print it to the standard output.

So for example, if I had the string given was:  s= “abcdxyzyxabcdaaa” . Then the longest palindrome within it is “xyzyx “. We need to write a function to find this for us.  The nature of the challenge just needed me to write a function for a web back-end, so the example code below does not have main, or a defined string, etc. Also, there are O(N) solutions for this problem if you seek them, but they are a little more complicated.

#include <iostream>
#include <string>

using namespace std;

void longest_palind(const string &s) {
int n = s.length();
int longestBegin = 0;
int maxLen = 1;
bool table[100][100] = {false};

for (int i = 0; i < n; i++)
{
table[i][i] = true;
}
for (int i = 0; i < n-1; i++)
{
if (s[i] == s[i+1]) {
table[i][i+1] = true;
longestBegin = i;
maxLen = 2;
}
}
for (int len = 3; len <= n; len++) {
for (int i = 0; i < n-len+1; i++) {
int j = i+len-1;
if (s[i] == s[j] && table[i+1][j-1]) {
table[i][j] = true;
longestBegin = i;
maxLen = len;
}
}
}
cout << s.substr(longestBegin, maxLen);
}
Advertisements

C++ Primer Plus Chapter 7 Exercise 9

c plus plusChapter 7 ends with a short exercise on function pointers. The simplest way to complete this, which I provided in my source, is to create the two functions add() and calculate(), then call them in main() with a loop. The text mentions if you are feeling adventurous to include other functions in addition to add. For simplicities sake, I did the minimum requirement here. Finally,  we can put this chapter to rest. See my source below:

9. Design a function calculate() that takes two type double values and a pointer to a function that takes two double arguments and returns a double. The calculate() function should also be type double, and it should return the value that the pointed-to function calculates, using the double arguments to calculate(). For example, suppose you have this definition for the add() function: double add(double x, double y){return x + y}. Then, the function call in double q = calculate(2.5, 10.4, add); would cause calculate() to pass the values 2.5 and 10.4 to the add() function and then return the add() return value (12.9). Use these functions and at least one additional function in the add() mold in a program. The program should use a loop that allows the user to enter pairs of numbers. For each pair, use calculate() to invoke add() and at least one other function. If you are feeling adventurous, try creating an array of pointers to add()-style functions and use a loop to successively apply calculate() to a series of functions by using these pointers. Hint: Here’s how to declare such an array of three pointers: double (*pf[3])(double, double); You can initialize such an array by using the usual array initialization syntax and function names as addresses.

#include <iostream>

using namespace std;

double calculate(double x, double y, double (*pf)(double a, double b));
double add(double x, double y);

int main()
{
double x, y;
cout << "Enter two numbers (q to exit): ";
while(cin >> x >> y)
{
if(cin.fail())
break;
calculate(x, y, add);
cout << "The sum is: " << calculate(x, y, add) << "\n\n";
}
return 0;
}

double calculate(double x, double y, double (*pf)(double a, double b))
{
return pf(x, y);
}

double add(double x, double y)
{
return x + y;
}

C++ Primer Plus Chapter 7 Exercise 8

c plus plus Exercise 8 has us re-writing a skeleton program to fill in the missing functions. A combination of structs, pointers, and functions will complete this exercise. Comments describing where and what additions have been made are embedded in the code. See my solution below:

8. This exercise provides practice in writing functions dealing with arrays and structures. The following is a program skeleton. Complete it by providing the described functions:


#include <iostream>

using namespace std;
const int SLEN = 30;
struct student {
char fullname[SLEN];
char hobby[SLEN];
int ooplevel;
};

int getinfo(student pa[], int n);
void display1(student st);
void display2(const student * ps);
void display3(const student pa[], int n);

int main(){
cout << "Enter class size: ";
int class_size;
cin >> class_size;
while (cin.get() != '\n')
continue;
student * ptr_stu = new student[class_size];
int entered = getinfo(ptr_stu, class_size);

for (int i = 0; i < entered; i++) {
display1(ptr_stu[i]);
display2(&ptr_stu[i]);
}
display3(ptr_stu, entered);
delete [] ptr_stu;
cout << "Done\n";

return 0;
}

// getinfo() has two arguments: a pointer to the first element of
// an array of student structures and an int representing the
// number of elements of the array. The function solicits and
// stores data about students. It terminates input upon filling
// the array or upon encountering a blank line for the student
// name. The function returns the actual number of array elements
// filled.
int getinfo(student pa[], int n)
{
int i;
for(i = 0; i < n; i++)
{
cout << "Student Number: " << (i+1) << "\n";
cout << "Student's Name: ";
cin.getline(pa[i].fullname, SLEN);

cout << "Enter students hobby: ";
cin.getline(pa[i].hobby, SLEN);

cout << "Enter students OOP level: ";
cin >> pa[i].ooplevel;
cin.get();
}
return i;
}

// display1() takes a student structure as an argument
// and displays its contents
void display1(student st)
{
cout << "\n=============Display 1================\n";
cout << "Student name: " << st.fullname << "\n";
cout << "Hobby: " <<  st.hobby << "\n";
cout << "OOP Level: " << st.ooplevel << "\n";
cout << "=============End Display 1==============\n";
}

// display2() takes the address of student structure as an
// argument and displays the structure's contents
void display2(const student * ps)
{
cout << "\n============Display 2================\n";
cout << "Students Name: " << ps->fullname << "\n";
cout << "Hobby: " << ps->hobby << "\n";
cout << "OOP Level" << ps->ooplevel << "\n";
cout << "==========End Display 2================\n";
}

// display3() takes the address of the first element of an array
// of student structures and the number of array elements as
// arguments and displays the contents of the structures
void display3(const student pa[], int n)
{
for(int i = 0; i < n; i++)
{
cout << "\n============Display 3================\n";
cout << "Student: " << (i+1) << "\n";
cout << "Fullname: " << pa[i].fullname << "\n";
cout << "OOP Level: " << pa[i].ooplevel << "\n";
cout << "=============End Display 3============\n";
}
}

Bubble Sort Algorithm

The Bubble Sort algorithm is one the simplest sorting algorithm to implement. It works by continually looping through pairs in a list and comparing each pair. At each pair, it will perform a swap if the pair happens to be in the wrong order. The order will either be ascending or descending depending on what the programmer wants. This happens until no more swaps are needed. This algorithm apparently gets the name “bubble-sort” because you can imagine the smaller elements bubble to the top of the list. Checkout my bubble sort implementation below. When ran, it will give a good visual reference for the algorithm. It sorts in ascending order, complexity O(n^2). This algorithm approaches O(n) if the elements are already almost in order. Note that is the not the most efficient algorithm for large data sets.

#include <iostream>

using namespace std;

int main()
{
int array[7];
int i, j;

for(i = 0; i <= 6; i++){
cout << "Enter unsorted numbers: " << endl;
cin >> array[i];
}
for(i = 0; i <= 5; i++){ //loop through pair of integers
for(j = i+1; j <= 6; j++){
int temp;
if(array[i] > array[j])
{
temp = array[i]; //swapping mechanisms
array[i] = array[j];
array[j] = temp;
}
}
}
for(i = 0; i <= 6; i++){
cout << array[i]; //sorted output
}
return 0;
}

Fizz Buzz C++

c plus plusThis is a “classic” fizz-buzz solution I created. For those of you who don’t already know what fizz-buzz is, it follows this basic context: “Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz””. This question has been asked by recruiters as a method for determining programming competency.  While the fizz-buzz question is not really difficult itself, it does force you to think about one of the most important concepts to programmers, loop structures.


#include <iostream>

using namespace std;

int main(){
for (int i = 0; i <= 100; i++) {
if ((i % 15) == 0) //for multiples of both 3 and 5
cout << "FizzBuzz" << endl;
else if ((i % 3) == 0) //multiples of 3
cout << "Fizz" << endl;
else if ((i % 5) == 0) //multiples of 5
cout << "Buzz" << endl;
else
cout << i << endl; //all other numbers
}
return 0;
}

C++ Primer Plus Chapter 7 Exercise 7

c plus plus

This exercise makes use heavier use of pointers then what we have been doing. However, much of this program can be pulled from listing 7.7 and around that part of the chapter. See source below.

Redo Listing 7.7, modifying the three array-handling functions to each use two pointer parameters to represent a range. The fill_array() function, instead of returning the actual number of items read, should return a pointer to the location after the last location filled; the other functions can use this pointer as the second argument to identify the end of the data.

#include <iostream>

using namespace std;

const int Max = 5;

// function prototypes
double * fill_array(double *first, double *last);
void show_array(const double *first, const double *last);
void revalue(double *first, double *last, double factor);

int main()
{
double properties[Max];
double * last;

last = fill_array(properties, properties+Max);
show_array(properties, last);

cout << "Enter revaluation factor: ";
double factor;
cin >> factor;

revalue(properties, last, factor);
show_array(properties, last);
cout << "Done.\n";

return 0;
}

double *fill_array(double *first, double *last)
{
double temp;
double *pt;
int i=0;
for (pt = first; pt != last; pt++, i++)
{
cout << "Enter value #" << (i + 1) << ": ";
cin >> temp;
if (!cin) // bad input
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Bad input; input process terminated.\n";
break;
}
else if (temp < 0) // signal to terminate
break;
*pt = temp;
}
return pt;
}

void show_array(const double *first, const double *last)
{
const double *pt;
int i=0;
for (pt = first; pt != last; pt++, i++)
{
cout << "Property #" << (i + 1) << ": $ \n";
cout << *pt;
}
}

void revalue(double *first, double *last, double factor)
{
double *pt;
for (pt = first; pt != last; pt++)
*pt *= factor;
}

C++ Primer Plus Chapter 7 Exercise 6

c plus plusExercise 6 of chapter 7 is not so bad because the first two functions are given to us in the text. However, you do need to do some thinking as to how to reverse an array. There are a few ways to do this. One would be to implement an XOR type algorithm. Another would be to use reverse() from the std library, and then you can do it the way I have done it which is work through the array by starting on the ends. The way I have done it is one of the most common ways to solve this problem and is good to know as it is sometimes used as a skill assessment on programming interviews. See source below.

Write a program that uses the following functions:
Fill_array() takes as arguments the name of an array of double values and an array
size. It prompts the user to enter double values to be entered in the array. It ceases taking
input when the array is full or when the user enters non-numeric input, and it
returns the actual number of entries.
Show_array() takes as arguments the name of an array of double values and an array
size and displays the contents of the array.
Reverse_array() takes as arguments the name of an array of double values and an
array size and reverses the order of the values stored in the array.
The program should use these functions to fill an array, show the array, reverse the array,
show the array, reverse all but the first and last elements of the array, and then show the
array.

#include <iostream>

using namespace std;

const int Max = 5;

int fill_array(double ar[], int limit);
 void show_array(const double ar[], int n);
 void reverse_array(double ar[], int n);

int main()
 {
 double properties[Max];
 int size = fill_array(properties, Max);
 cout << endl;
 show_array(properties, size);
 cout << endl;
 reverse_array(properties, size);
 show_array(properties, size);
 cout << endl;
 reverse_array(properties + 1, size -2);
 show_array(properties, size);
 return 0;
 }

int fill_array(double ar[], int limit)
 {
 double temp;
 int i;
 for(i = 0; i < limit; i++)
 {
 cout << "Enter value #" << (i + 1) << ": ";
 cin >> temp;
 if(!cin)
 {
 cin.clear();
 while(cin.get() != '\n')
 continue;
 cout << "Bad input; input process terminated" << endl;
 break;
 }
 else if(temp < 0)
 break;
 ar[i] = temp;
 }
 return i;
 }

void show_array(const double ar[], int n)
 {
 for (int i = 0; i < n; i++)
 {
 cout << "Property #" << (i + 1) << ": ";
 cout << ar[i] << endl;
 }
 }

void reverse_array(double ar[], int n)
 {
 double temp;
 for(int i = 0; i < n/2; i++)
 {
 temp = ar[i];
 ar[i] = ar[n - i - 1];
 ar[n - i - 1] = temp;
 }
 }

Note: for the sake of the solution. fill_array() could be stripped of the error handling code to make this easier to read.