To find the longest common prefix after removing at most one string, we can precompute the common prefix for all prefixes and suffixes. For each string, consider removing it and compute the intersection of the prefix before and after it.
classSolution {
public: string longestCommonPrefixAfterRemoval(vector<string>& arr) {
int n = arr.size();
vector<string> pre(n+1), suf(n+1);
pre[0] = suf[n] ="";
for (int i =0; i < n; ++i) {
pre[i+1] = commonPrefix(pre[i], arr[i]);
}
for (int i = n-1; i >=0; --i) {
suf[i] = commonPrefix(suf[i+1], arr[i]);
}
string ans ="";
for (int i =0; i < n; ++i) {
string p = commonPrefix(pre[i], suf[i+1]);
if (p.size() > ans.size()) ans = p;
}
return ans;
}
string commonPrefix(const string& a, const string& b) {
int i =0;
while (i < a.size() && i < b.size() && a[i] == b[i]) i++;
return a.substr(0, i);
}
};
classSolution {
public String longestCommonPrefixAfterRemoval(String[] arr) {
int n = arr.length;
String[] pre =new String[n+1], suf =new String[n+1];
pre[0]=""; suf[n]="";
for (int i = 0; i < n; i++) pre[i+1]= commonPrefix(pre[i], arr[i]);
for (int i = n-1; i >= 0; i--) suf[i]= commonPrefix(suf[i+1], arr[i]);
String ans ="";
for (int i = 0; i < n; i++) {
String p = commonPrefix(pre[i], suf[i+1]);
if (p.length() > ans.length()) ans = p;
}
return ans;
}
private String commonPrefix(String a, String b) {
int i = 0;
while (i < a.length() && i < b.length() && a.charAt(i) == b.charAt(i)) i++;
return a.substring(0, i);
}
}
classSolution {
funlongestCommonPrefixAfterRemoval(arr: Array<String>): String {
val n = arr.size
val pre = Array(n+1) { "" }
val suf = Array(n+1) { "" }
for (i in0 until n) pre[i+1] = commonPrefix(pre[i], arr[i])
for (i in n-1 downTo 0) suf[i] = commonPrefix(suf[i+1], arr[i])
var ans = ""for (i in0 until n) {
val p = commonPrefix(pre[i], suf[i+1])
if (p.length > ans.length) ans = p
}
return ans
}
privatefuncommonPrefix(a: String, b: String): String {
var i = 0while (i < a.length && i < b.length && a[i] == b[i]) i++return a.substring(0, i)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution:
deflongestCommonPrefixAfterRemoval(self, arr: list[str]) -> str:
n = len(arr)
pre = [""] * (n+1)
suf = [""] * (n+1)
for i in range(n):
pre[i+1] = self.commonPrefix(pre[i], arr[i])
for i in range(n-1, -1, -1):
suf[i] = self.commonPrefix(suf[i+1], arr[i])
ans =""for i in range(n):
p = self.commonPrefix(pre[i], suf[i+1])
if len(p) > len(ans):
ans = p
return ans
defcommonPrefix(self, a: str, b: str) -> str:
i =0while i < len(a) and i < len(b) and a[i] == a