100251. 数组中的最短非公共子字符串 暴力解法

100251. 数组中的最短非公共子字符串

  • 通过的用户数684
  • 尝试过的用户数891
  • 用户总通过次数696
  • 用户总提交次数1416
  • 题目难度Medium

给你一个数组 arr ,数组中有 n 个 非空 字符串。

请你求出一个长度为 n 的字符串 answer ,满足:

  • answer[i] 是 arr[i] 最短 的子字符串,且它不是 arr 中其他任何字符串的子字符串。如果有多个这样的子字符串存在,answer[i] 应该是它们中字典序最小的一个。如果不存在这样的子字符串,answer[i] 为空字符串。

请你返回数组 answer 。

 

示例 1:

输入:arr = ["cab","ad","bad","c"]
输出:["ab","","ba",""]
解释:求解过程如下:
- 对于字符串 "cab" ,最短没有在其他字符串中出现过的子字符串是 "ca" 或者 "ab" ,我们选择字典序更小的子字符串,也就是 "ab" 。
- 对于字符串 "ad" ,不存在没有在其他字符串中出现过的子字符串。
- 对于字符串 "bad" ,最短没有在其他字符串中出现过的子字符串是 "ba" 。
- 对于字符串 "c" ,不存在没有在其他字符串中出现过的子字符串。

示例 2:

输入:arr = ["abc","bcd","abcd"]
输出:["","","abcd"]
解释:求解过程如下:
- 对于字符串 "abc" ,不存在没有在其他字符串中出现过的子字符串。
- 对于字符串 "bcd" ,不存在没有在其他字符串中出现过的子字符串。
- 对于字符串 "abcd" ,最短没有在其他字符串中出现过的子字符串是 "abcd" 。

 

提示:

  • n == arr.length
  • 2 <= n <= 100
  • 1 <= arr[i].length <= 20
  • arr[i] 只包含小写英文字母。


 暴力解法
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 class Solution {
 4     public static String[] shortestSubstrings(String[] arr) {
 5         String[] res = new String[arr.length];
 6         for(int i =0;i< arr.length;i++){
 7             List<String> subString = getAllSubstrings(arr[i]);
 8             int length = Integer.MAX_VALUE;
 9             String record = "";
10 
11             for(int k = 0; k <subString.size();k++){
12                 boolean flag = true;
13                 for(int j = 0;j< arr.length;j++){
14                     if(i!=j){
15                         if(isSubstring(subString.get(k), arr[j])){
16                             flag=false;
17                             break;
18                         }
19                     }
20                 }
21                 if(flag== true){
22                     if(length>subString.get(k).length()){
23                         length = subString.get(k).length();
24                         record = subString.get(k);
25                     }
26                     else if(length==subString.get(k).length() && record.compareTo(subString.get(k))>0){
27                         length = subString.get(k).length();
28                         record = subString.get(k);
29                     }
30                 }
31                 res[i] = record;
32             }
33 
34 
35         }
36         return res;
37     }
38 
39     public static List<String> getAllSubstrings(String str) {
40         List<String> substrings = new ArrayList<>();
41         int len = str.length();
42 
43         // 遍历字符串中的每个字符作为起始点
44         for (int i = 0; i < len; i++) {
45             // 对于每个起始点,遍历到结尾以生成所有可能的子串
46             for (int j = i; j < len; j++) {
47                 substrings.add(str.substring(i, j + 1));
48             }
49         }
50 
51         return substrings;
52     }
53 
54     public static boolean isSubstring(String str1, String str2) {
55         // 如果str1为空,则它当然可以是任何字符串(包括str2)的子串
56         if (str1 == null || str1.isEmpty()) {
57             return true;
58         }
59 
60         // indexOf()方法会返回str1在str2中首次出现的位置,如果str1不是str2的子串,则返回-1
61         int index = str2.indexOf(str1);
62         return index != -1;
63     }
64 }

 

posted @ 2024-03-10 11:56  Heinrich♣  阅读(14)  评论(0编辑  收藏  举报