Created
April 14, 2014 22:20
-
-
Save foo4u/10686885 to your computer and use it in GitHub Desktop.
Provides a solution to the "Minimum Cuts for Palindrome Partitioning" problem http://basicalgos.blogspot.com/2013/03/67-palindrome-partitioning.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Provides methods to determine minimum the number of cuts | |
* required to split a string into palindromes. | |
* | |
* @author Scott Rossillo | |
*/ | |
public final class Partitioner { | |
/** | |
* Returns true if the given string is a palindrome. | |
*/ | |
public static boolean isPalindrome(final String s) { | |
int i = 0; | |
int j = s.length() - 1; | |
while (i < j) { | |
if (s.charAt(i++) != s.charAt(j--)) { | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Returns the minimum number of cuts required to partition | |
* the given string for palindrome partitioning. | |
*/ | |
public static int minCuts(final String s) { | |
int cuts = -1; | |
for (int i = 0; i < s.length(); i++) { | |
for (int j = s.length(); j > 0; j--) { | |
final String t = s.substring(i, j); | |
if (isPalindrome(t)) { | |
cuts++; | |
i = j - 1; | |
break; | |
} | |
} | |
} | |
return cuts; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.junit.Assert; | |
import org.junit.Test; | |
/** | |
* Provides palindrome partitioner unit tests. | |
* | |
* @author Scott Rossillo | |
*/ | |
public final class PartitionerTests { | |
@Test | |
public void testIsPalindrome() { | |
Assert.assertTrue(Partitioner.isPalindrome("madam")); | |
Assert.assertTrue(Partitioner.isPalindrome("a")); | |
Assert.assertTrue(Partitioner.isPalindrome("aa")); | |
Assert.assertTrue(Partitioner.isPalindrome("aba")); | |
Assert.assertTrue(Partitioner.isPalindrome("abba")); | |
Assert.assertTrue(Partitioner.isPalindrome("abccba")); | |
Assert.assertTrue(Partitioner.isPalindrome("abcddcba")); | |
} | |
@Test | |
public void testIsPalindromeNot() { | |
Assert.assertFalse(Partitioner.isPalindrome("madams")); | |
Assert.assertFalse(Partitioner.isPalindrome("smadam")); | |
Assert.assertFalse(Partitioner.isPalindrome("ab")); | |
Assert.assertFalse(Partitioner.isPalindrome("abc")); | |
Assert.assertFalse(Partitioner.isPalindrome("abcd")); | |
} | |
@Test | |
public void testMinCutsZero() { | |
Assert.assertEquals(0, Partitioner.minCuts("madam")); | |
Assert.assertEquals(0, Partitioner.minCuts("a")); | |
Assert.assertEquals(0, Partitioner.minCuts("aa")); | |
} | |
@Test | |
public void testMinCutsOne() { | |
Assert.assertEquals(1, Partitioner.minCuts("aab")); | |
Assert.assertEquals(1, Partitioner.minCuts("baa")); | |
Assert.assertEquals(2, Partitioner.minCuts("aaba")); | |
Assert.assertEquals(2, Partitioner.minCuts("abzz")); | |
Assert.assertEquals(1, Partitioner.minCuts("madams")); | |
Assert.assertEquals(1, Partitioner.minCuts("smadam")); | |
} | |
@Test | |
public void testMinCutsTwo() { | |
Assert.assertEquals(2, Partitioner.minCuts("abc")); | |
Assert.assertEquals(2, Partitioner.minCuts("aabc")); | |
Assert.assertEquals(2, Partitioner.minCuts("abcc")); | |
Assert.assertEquals(2, Partitioner.minCuts("XXXXmomZ")); | |
Assert.assertEquals(2, Partitioner.minCuts("XmaamZ")); | |
} | |
@Test | |
public void testMinCutsThree() { | |
Assert.assertEquals(3, Partitioner.minCuts("XXXXmomZqq")); | |
Assert.assertEquals(3, Partitioner.minCuts("XmaamZqq")); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment