我编写了一个程序来删除第一个字符串中出现的第二个字符串中的字符。复杂性是BigO(n ^ 2)。可以进一步降低复杂性吗?
public class Tmp {
public static void main(String[] args) {
String s = "halloween";
String s1 = "halcyon";
char[] ss = s.toCharArray();
char[] ss1 = s1.toCharArray();
for(int i=0;i<ss.length;i++){
for(int j=0;j<ss1.length;j++){
if(ss1[j] == ss[i]){
ss1[j] = 'x'; //Replace the common char with x
}
}
}
System.out.println(Arrays.toString(ss1));
}
}
输出
[x, x, x, c, y, x, x]
答案 0 :(得分:2)
您可以选择将第二个字符串转换为HashSet(如果第二个字符串中没有重复的字母)。然后检查hashmap中第一个字符串中每个字母的存在,如果找到则删除。
遍历String数组的O(N)复杂度和HashSet中put / get的复杂度几乎为O(1)。
答案 1 :(得分:2)
总时间复杂度= O(N)
这里有额外的空间复杂度来存储MAP。
答案 2 :(得分:1)
如果源字符串中的所有字符都是小写字母,则可以使用大小为26的布尔数组。 然后从开始到结束扫描源字符串,如果字符存在则更新布尔数组。 然后扫描目标字符串并检查布尔数组是否存在于源数组中。
复杂性将等于两个字符串的总和&#39;长度。
答案 3 :(得分:0)
从输入字符串中删除掩码字符串中存在的字符
public class RemoveCharacterFromFisrtStringWhichPInSecondString {
public static void removeCharactersFromFirstString(String str1,String str2){
StringBuilder sb = new StringBuilder(str1.toLowerCase());
char maskArray[] = populateMaskArray(str2);
for(int i=0;i<str1.length();i++){
char ch = str1.toLowerCase().charAt(i);
int index = sb.toString().indexOf(ch);
if(maskArray[ch] == ch) {
sb.deleteCharAt(index);
}
}
System.out.println(sb.toString());
}
/**
* Time Complexity: O(m) Where m is the length of mask string.
*/
static char[] populateMaskArray(String mask) {
char[] array = new char[256];
for(int i = 0; i < mask.length(); i++) {
array[mask.charAt(i)] = mask.charAt(i);
}
return array;
}
public static void main(String[] args) {
String str1 = "India is country";
String str2 = "in";
removeCharactersFromFirstString(str1,str2);
}
}
答案 4 :(得分:0)
public class Test{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str,sbstr;
System.out.println("Enter the first String : ");
str = sc.nextLine();
System.out.println("Enter the second String : ");
sbstr = sc.nextLine();
char [] c1str = str.toCharArray();
char [] c2sbstr = sbstr.toCharArray();
for(int j=0;j<c2sbstr.length;j++) {
for(int i=0;i<c1str.length;i++) {
if(c1str[i] == c2sbstr[j]) {
c1str[i] = 0;
}
}
}
System.out.println("After removing the characters of second string from first string :");
for(int i=0;i<c1str.length;i++) {
System.out.print(c1str[i]);
}
}
}
答案 5 :(得分:-1)
public static String removeCharAt(String s, int pos) {
return s.substring(0, pos) + s.substring(pos + 1);
}
public static void main(String[] args) {
String s1 = "India is great ";
s1 = s1.toLowerCase();
String s2="in";
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s2.length(); j++) {
if(s2.charAt(j) == s1.charAt(i)) {
s1 = removeCharAt(s1, i);
}
}
}
System.out.println(s1);
}