字符串变位词检查:有多种方法来查找两个字符串是变位词还是非变位词。经典的方法是获取每个字符串的字符数组,然后比较它们,如果两个字符数组都相等,那么字符串就是变位词。但在进行比较之前,请确保两个字符串的大小写相同(例如小写或大写),并且对字符数组进行排序,因为equals数组方法,只有当数组包含相同的长度,并且每个索引具有相同的字符时才返回true。
为了简单起见,我省略了检查字符串是否为空,并将其转换为大写或小写,如果需要,可以执行此操作。如果面试官要求你写生产质量代码,那么我建议你一定要做这些检查,并为空字符串抛出IllegalArgumentException,否则你只需返回false。我个人更喜欢返回false而不是抛出异常,类似于equals()方法。不管怎样,这里有三种方法来检查两个字符串是否是变位词。我还包括了一个JUnit测试来验证各种包含变位词和非变位词的字符串。
<b>import</b> java.util.Arrays; <font><i>/** * Java program - String Anagram Example. * This program checks if two Strings are anagrams or not * * @author Javin Paul */</i></font><font> <b>public</b> <b>class</b> AnagramCheck { </font><font><i>/* * One way to find if two Strings are anagram in Java. This method * assumes both arguments are not null and in lowercase. * * @return true, if both String are anagram */</i></font><font> <b>public</b> <b>static</b> <b>boolean</b> isAnagram(String word, String anagram){ <b>if</b>(word.length() != anagram.length()){ <b>return</b> false; } <b>char</b>[] <b>char</b>s = word.toCharArray(); <b>for</b>(<b>char</b> c : <b>char</b>s){ <b>int</b> index = anagram.indexOf(c); <b>if</b>(index != -1){ anagram = anagram.substring(0,index) + anagram.substring(index +1, anagram.length()); }<b>else</b>{ <b>return</b> false; } } <b>return</b> anagram.isEmpty(); } </font><font><i>/* * Another way to check if two Strings are anagram or not in Java * This method assumes that both word and anagram are not null and lowercase * @return true, if both Strings are anagram. */</i></font><font> <b>public</b> <b>static</b> <b>boolean</b> iAnagram(String word, String anagram){ <b>char</b>[] <b>char</b>FromWord = word.toCharArray(); <b>char</b>[] <b>char</b>FromAnagram = anagram.toCharArray(); Arrays.sort(charFromWord); Arrays.sort(charFromAnagram); <b>return</b> Arrays.equals(charFromWord, charFromAnagram); } <b>public</b> <b>static</b> <b>boolean</b> checkAnagram(String first, String second){ <b>char</b>[] <b>char</b>acters = first.toCharArray(); StringBuilder sbSecond = <b>new</b> StringBuilder(second); <b>for</b>(<b>char</b> ch : <b>char</b>acters){ <b>int</b> index = sbSecond.indexOf(</font><font>""</font><font> + ch); <b>if</b>(index != -1){ sbSecond.deleteCharAt(index); }<b>else</b>{ <b>return</b> false; } } <b>return</b> sbSecond.length()==0 ? <b>true</b> : false; } } </font>
字符串变位词exmaple的JUnit测试用例
这是我们对anagramcheck类的三个方法的JUnit测试,我们实际上用类似的输入集测试了所有方法。
<b>import</b> org.junit.Test; <b>import</b> <b>static</b> org.junit.Assert.*; <font><i>/** * JUnit test class to test various anagram program for various String input. */</i></font><font> <b>public</b> <b>class</b> StringAnagramTest { @Test <b>public</b> <b>void</b> testIsAnagram() { assertTrue(AnagramCheck.isAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>)); assertTrue(AnagramCheck.isAnagram(</font><font>"mary"</font><font>, </font><font>"army"</font><font>)); assertTrue(AnagramCheck.isAnagram(</font><font>"stop"</font><font>, </font><font>"tops"</font><font>)); assertTrue(AnagramCheck.isAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>)); assertFalse(AnagramCheck.isAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>)); assertFalse(AnagramCheck.isAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>)); assertFalse(AnagramCheck.isAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>)); assertFalse(AnagramCheck.isAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>)); assertTrue(AnagramCheck.isAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>)); assertFalse(AnagramCheck.isAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>)); } @Test <b>public</b> <b>void</b> testIAnagram() { assertTrue(AnagramCheck.iAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>)); assertTrue(AnagramCheck.iAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>)); assertFalse(AnagramCheck.iAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>)); assertFalse(AnagramCheck.iAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>)); assertTrue(AnagramCheck.iAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>)); assertFalse(AnagramCheck.iAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>)); assertFalse(AnagramCheck.iAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>)); assertFalse(AnagramCheck.iAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>)); } @Test <b>public</b> <b>void</b> testcheckAnagram() { assertTrue(AnagramCheck.checkAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>)); assertFalse(AnagramCheck.checkAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>)); assertFalse(AnagramCheck.checkAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>)); assertTrue(AnagramCheck.checkAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>)); assertFalse(AnagramCheck.checkAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>)); assertTrue(AnagramCheck.checkAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>)); assertFalse(AnagramCheck.checkAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>)); assertFalse(AnagramCheck.checkAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>)); } } Output Testsuite: StringAnagramTest Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 0.094 sec </font>
我们的anagramcheck类包含3个静态方法来验证字符串是否为变位词。首先,获取第一个字符串的字符数组并循环遍历它,然后在第二个字符串中查找该字符,并使用substring方法删除它。如果第二个字符串不包含字符,则立即返回false。测试结束时,如果第二个字符串为空,则两个字符串都是变位词,因为它们包含相同的字符集。为了提高性能,我们在这个方法的最开始就检查了长度,因为两个长度不同的字符串不能互相变位。第三个方法与第一个方法完全相同,只是它使用StringBuilder的DeleteCharat(int index)方法删除字符。