diff --git a/yitou/src/SimilarNameFriends.java b/yitou/src/SimilarNameFriends.java new file mode 100644 index 0000000000000000000000000000000000000000..85985310d4e942b4d69bb101f7dc208de19cb87a --- /dev/null +++ b/yitou/src/SimilarNameFriends.java @@ -0,0 +1,51 @@ +package src; + +import java.util.Scanner; + +public class SimilarNameFriends { + + public static void main(final String[] args) { + final Scanner scanner = new Scanner(System.in); + + final int people = scanner.nextInt(); + scanner.nextLine(); // 改行を消費 + + // 名前を格納する配列 + final String[] membersName = new String[people]; + for (int i = 0; i < people; i++) { + membersName[i] = scanner.nextLine(); + } + + int maxSimilarity = 0; + + // すべてのペア比較 + for (int base = 0; base < people; base++) { + for (int next = base + 1; next < people; next++) { + maxSimilarity = Math.max(maxSimilarity, compareNames(membersName[base], membersName[next])); + } + } + System.out.println(maxSimilarity); + } + + // 名前を比較するメソッド + public static int compareNames(final String member1, final String member2) { + return longestCommonSubstring(member1, member2); + } + + // 最長の連続部分文字列をさがすメソッド + public static int longestCommonSubstring(final String memberName1, final String memberName2) { + final int[][] lengthTable = new int[memberName1.length() + 1][memberName2.length() + 1]; + int maxLength = 0; + + for (int base = 1; base <= memberName1.length(); base++) { + for (int next = 1; next <= memberName2.length(); next++) { + if (memberName1.charAt(base - 1) == memberName2.charAt(next - 1)) { + lengthTable[base][next] = lengthTable[base - 1][next - 1] + 1; + maxLength = Math.max(maxLength, lengthTable[base][next]); + } + } + } + + return maxLength; + } +} \ No newline at end of file diff --git a/yitou/test/SimilarNameFriendsTest.java b/yitou/test/SimilarNameFriendsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..44c5189f5a979c758a520daf077b2850db4e1bb9 --- /dev/null +++ b/yitou/test/SimilarNameFriendsTest.java @@ -0,0 +1,37 @@ +package test; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import src.SimilarNameFriends; + +public class SimilarNameFriendsTest { + + @Test + public void testLongestCommonSubstring() { + assertEquals(3, SimilarNameFriends.longestCommonSubstring("nakata", "takahashi")); + assertEquals(4, SimilarNameFriends.longestCommonSubstring("nakata", "tanaka")); + assertEquals(3, SimilarNameFriends.longestCommonSubstring("takahashi", "tanaka")); + + } + + @Test + public void testCompareNames() { + assertEquals(2, SimilarNameFriends.compareNames("apple", "apricot")); + assertEquals(4, SimilarNameFriends.compareNames("banana", "cabana")); + } + + @Test + public void testMaxSimilarity() { + // テスト用のサンプルデータ + final String[] membersName = {"tanaka", "nakata", "takahashi"}; + + int maxSimilarity = 0; + for (int i = 0; i < membersName.length; i++) { + for (int j = i + 1; j < membersName.length; j++) { + maxSimilarity = Math.max(maxSimilarity, SimilarNameFriends.compareNames(membersName[i], membersName[j])); + } + } + + assertEquals(4, maxSimilarity); // "nakata" と "tanaka" の共通部分文字列の長さ + } +}