From 9e1afe9cb9b5a00c2af38f3239fa9268a434c429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E5=8B=87=E8=BC=9D?= Date: Fri, 18 Oct 2024 14:16:42 +0900 Subject: [PATCH] =?UTF-8?q?=E5=95=8F=E9=A1=8CB124?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yitou/src/SimilarNameFriends.java | 51 ++++++++++++++++++++++++++ yitou/test/SimilarNameFriendsTest.java | 37 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 yitou/src/SimilarNameFriends.java create mode 100644 yitou/test/SimilarNameFriendsTest.java diff --git a/yitou/src/SimilarNameFriends.java b/yitou/src/SimilarNameFriends.java new file mode 100644 index 0000000..8598531 --- /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 0000000..44c5189 --- /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" の共通部分文字列の長さ + } +} -- GitLab