【问题标题】:Remove characters from the second string which are present in the first string从第二个字符串中删除第一个字符串中存在的字符
【发布时间】:2016-07-18 06:54:02
【问题描述】:

我编写了一个程序来从第二个字符串中删除第一个字符串中存在的字符。复杂度为 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]

【问题讨论】:

  • 您可以将您的代码放在代码审查中以获得更好的结果。 codereview.stackexchange.com
  • 是的,您可以将其缩减为O(n log n)
  • 将 string1 的所有字符添加到集合 (O(n))。接下来,对于 string-2 中的每个 char,在 set-1 上使用 contains(),如果该 char 存在,则将其设置为 'x' (O(n))

标签: java algorithm


【解决方案1】:
  1. 将第一个字符串转换为映射。 O(N)
  2. 遍历其他字符串并检查步骤 1 中的 Map 中是否存在字符。 O(N) + O(1)

总时间复杂度 = O(N)

在这里您需要额外的空间复杂度来存储 MAP。

【讨论】:

  • 将第一个字符串转换成地图 O(N) 没关系,但是当我遍历另一个字符串以签入地图时,它也将是 O(N)。总复杂度不会是 O(N) + O(N)
  • 是的,总复杂度为 O(N) + O(N),因为有两个不同的循环,即 2*O(N)。这里 2 是常数,对于非常大的 N,我们可以忽略 2。因此,最终复杂度将为 O(N)。
【解决方案2】:

您可以选择将第二个字符串转换为 HashSet(如果第二个字符串中没有重复的字母)。然后检查 hashmap 中第一个字符串的每个字母是否存在,如果找到则删除。

遍历String数组的复杂度为O(N),HashSet中put/get的复杂度几乎为O(1)。

【讨论】:

  • 最好将 first 字符串转换为 map,然后从 map 中找到的第二个字符串中删除字母。这种方式支持重复字符。
【解决方案3】:

如果源字符串中的所有字符都是小写字母,则可以有一个大小为 26 的布尔数组。 然后从头到尾扫描源字符串,如果字符存在则更新布尔数组。 然后扫描目标字符串并检查布尔数组是否存在于源数组中。

复杂度将等于两个字符串长度之和。

【讨论】:

  • '如果字符存在'的复杂度为 O(n)。现在总复杂度将是 O(n^2)
【解决方案4】:

从输入字符串中删除掩码字符串中存在的字符

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);

    }

}

【讨论】:

    【解决方案5】:
    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]); 
            }  
        }
    }
    

    【讨论】:

      【解决方案6】:
       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);
              
      }
      

      【讨论】:

      • 这不是答案,因为您没有降低复杂性
      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多