【问题标题】:Reverse string without affecting specific characters that user can input反转字符串而不影响用户可以输入的特定字符
【发布时间】:2022-09-24 12:07:56
【问题描述】:

需要在不影响用户可以输入忽略的所有非字母字符和特定字符的情况下反转字符串。我想出了如何忽略非字母字符,它可以在文本到反向匹配文本到忽略字符串时完成工作,但在它不同时不起作用。
这是我的代码:

public class Anagram {

public static String reverseString(String rev, String ignore) {
    char[] str = rev.toCharArray();
    int r = str.length - 1;
    int l = 0;
    if ((ignore != null) && ignore.contains(rev)) {
        char[] ign = ignore.toCharArray();
        while (l < r)
            for (int i = 0; i < ignore.length(); i++) {
                if (!Character.isAlphabetic(str[l]) || (ign[i] == str[l])) {
                    l++;
                } else if (!Character.isAlphabetic(str[r]) || (ign[i] == str[r])) {
                    r--;
                } else {
                    char tmp = str[l];
                    str[l] = str[r];
                    str[r] = tmp;
                    l++;
                    r--;
                }
            }
    } else {
        while (l < r) {
            if (!Character.isAlphabetic(str[l])) {
                l++;
            } else if (!Character.isAlphabetic(str[r])) {
                r--;
            } else {
                char tmp = str[l];
                str[l] = str[r];
                str[r] = tmp;
                l++;
                r--;
            }
        }
    }
    return new String(str);
}}}

例如我需要什么: 输入:字符串 rev \"abcdefg\",字符串忽略 \"cf\" 输出:\"gecdbfa\"

  • 请提供示例输入和输出。
  • 我需要的示例:输入:String rev \"abcdefg\",String ignore \"cf\" 输出:\"gecdbfa\"
  • 你如何建议这样做 - 用你自己的话说?您当前的代码有什么问题?

标签: java string reverse


【解决方案1】:

在您的代码中,当您在 2 个位置交换值时,它们都必须是有效字符,这意味着既是字母,又不是 ignore 的字符。第二个问题是您将ignore 的字符直接等同于ign[i] == str[l]rev 字符串的左指针。它们不需要以这种方式在索引方面重合。


算法:

  • 创建一组ignore 中的所有字符。
  • 创建一个char 类型的result 数组,其长度与rev 相同。
  • 创建另一个长度与rev 相同的reserved 布尔数组。
  • 现在,逐个字符循环rev。如果它是非字母或ignore 的字符之一,则使用该字符修复该位置。在reserved 中,将此索引标记为true,因为我们现在不能乱用此索引。
  • 完成后,再次从左到右移动字符串rev,这次只考虑字母字符和不属于ignore 的字符。现在,以相反的方式将它们添加到 result 中以实际存储在反转状态。请注意,使用简单的ptr--,下一个非保留位置在本质上并不总是连续的。我们需要一个while循环来获得下一个非保留座位并将它们插入那里。

片段:

public static String reverseString(String rev, String ignore) {
  Set<Character> set = new HashSet<>();
  for(int i = 0; i < ignore.length(); ++i){
    set.add(ignore.charAt(i));
  }
  
  char[] result = new char[rev.length()];
  boolean[] reserved = new boolean[rev.length()];
  
  
  for(int i = 0; i < rev.length(); ++i){
    if(!Character.isAlphabetic(rev.charAt(i)) || set.contains(rev.charAt(i))){
      result[i] = rev.charAt(i);
      reserved[i] = true;
    }
  }
  
  int ptr = rev.length() - 1;
  for(int i = 0; i < rev.length(); ++i){
    if(Character.isAlphabetic(rev.charAt(i)) && !set.contains(rev.charAt(i))){
      while(ptr >= 0 && reserved[ptr]) ptr--;
      result[ptr--] = rev.charAt(i);
    }
  }
  
  return new String(result);
}

Online Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多