100251. 陣列中的最短非公共子字串 暴力解法

Heinrich♣發表於2024-03-10

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 }

相關文章