mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
166 lines
2.9 KiB
C++
166 lines
2.9 KiB
C++
//
|
|
// FILE: develop.ino
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.1.0
|
|
// PURPOSE: search the longest palindrome
|
|
// DATE: 2021-12-02
|
|
// URL: https://github.com/RobTillaart/
|
|
|
|
|
|
#include "Arduino.h"
|
|
|
|
|
|
uint32_t start, stop;
|
|
|
|
#define PLEN 1600
|
|
char str[PLEN];
|
|
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println(__FILE__);
|
|
|
|
for (int i = 0; i < PLEN - 1; i++)
|
|
{
|
|
str[i] = 'a' + random(4);
|
|
}
|
|
str[PLEN - 1] = 0;
|
|
|
|
//Serial.println(str);
|
|
// delay(100);
|
|
|
|
int position = 0;
|
|
int length = 0;
|
|
start = micros();
|
|
findOddPalindrome(str, position, length);
|
|
stop = micros();
|
|
Serial.print(stop - start);
|
|
Serial.print("\t");
|
|
printPartial(str, position, length);
|
|
Serial.println();
|
|
delay(100);
|
|
|
|
start = micros();
|
|
findEvenPalindrome(str, position, length);
|
|
stop = micros();
|
|
Serial.print(stop - start);
|
|
Serial.print("\t");
|
|
printPartial(str, position, length);
|
|
Serial.println();
|
|
delay(100);
|
|
|
|
start = micros();
|
|
findPalindrome(str, position, length);
|
|
stop = micros();
|
|
Serial.print(stop - start);
|
|
Serial.print("\t");
|
|
printPartial(str, position, length);
|
|
Serial.println();
|
|
delay(100);
|
|
|
|
Serial.println("done...");
|
|
}
|
|
|
|
|
|
void loop()
|
|
{
|
|
}
|
|
|
|
|
|
int findPalindrome(const char * str, int &position, int &length)
|
|
{
|
|
int posOdd = 0, lengthOdd = 0;
|
|
int posEven = 0, lengthEven = 0;
|
|
findOddPalindrome(str, posOdd, lengthOdd);
|
|
findEvenPalindrome(str, posEven, lengthEven);
|
|
if (lengthEven > lengthOdd)
|
|
{
|
|
position = posEven;
|
|
length = lengthEven;
|
|
return length;
|
|
}
|
|
position = posOdd;
|
|
length = lengthOdd;
|
|
return length;
|
|
}
|
|
|
|
|
|
int findEvenPalindrome(const char * str, int &position, int &length)
|
|
{
|
|
int sl = strlen(str);
|
|
if (sl == 0) return -1;
|
|
|
|
int newpos = 0;
|
|
int newlen = 1;
|
|
for (int i = 0; i < sl; i++)
|
|
{
|
|
if (str[i] != str[i + 1]) continue;
|
|
int j = i - 1;
|
|
int k = i + 2;
|
|
while (0 <= j && k < sl)
|
|
{
|
|
if (str[j] != str[k]) break;
|
|
j--;
|
|
k++;
|
|
}
|
|
int pos = j + 1;
|
|
int len = k - j - 1;
|
|
if (len > newlen)
|
|
{
|
|
newlen = len;
|
|
newpos = pos;
|
|
// printPartial(str, newpos, newlen);
|
|
}
|
|
}
|
|
position = newpos;
|
|
length = newlen;
|
|
return length;
|
|
}
|
|
|
|
|
|
int findOddPalindrome(const char * str, int &position, int &length)
|
|
{
|
|
int sl = strlen(str);
|
|
if (sl == 0) return -1;
|
|
|
|
int newpos = 0;
|
|
int newlen = 1;
|
|
for (int i = 1; i < sl; i++)
|
|
{
|
|
int j = i - 1;
|
|
int k = i + 1;
|
|
while (0 <= j && k < sl)
|
|
{
|
|
if (str[j] != str[k]) break;
|
|
j--;
|
|
k++;
|
|
}
|
|
int pos = j + 1;
|
|
int len = k - j - 1;
|
|
if (len > newlen)
|
|
{
|
|
newlen = len;
|
|
newpos = pos;
|
|
// printPartial(str, newpos, newlen);
|
|
}
|
|
}
|
|
position = newpos;
|
|
length = newlen;
|
|
return length;
|
|
}
|
|
|
|
|
|
void printPartial(char * str, int pos, int len)
|
|
{
|
|
Serial.print(pos);
|
|
Serial.print("\t");
|
|
Serial.print(len);
|
|
Serial.print("\t");
|
|
for (int a = pos; a < pos + len; a++) Serial.print(str[a]);
|
|
Serial.println();
|
|
}
|
|
|
|
// -- END OF FILE --
|
|
|