Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找通过翻转列可以获得的2D数组中具有相同字符的最大行数?_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 查找通过翻转列可以获得的2D数组中具有相同字符的最大行数?

Algorithm 查找通过翻转列可以获得的2D数组中具有相同字符的最大行数?,algorithm,dynamic-programming,Algorithm,Dynamic Programming,您将获得一个M X N 2D数组,该数组只能包含字符“a”或“b”。唯一允许的操作是翻转一列,使该列中的每个“a”都变成“b”,反之亦然。允许任意数量的列翻转。查找只有“a”或“b”的最大行数 输入的第一行将给出矩阵的维度,其余的行将表示矩阵的每一行 Input: 3 3 a a b b b b b b a Output: 2 说明: 翻转第3列将使第1行仅包含“a”,并使第2行仅包含“b” After flipping column 3: a a a b b a b b b 有人能提供

您将获得一个M X N 2D数组,该数组只能包含字符“a”或“b”。唯一允许的操作是翻转一列,使该列中的每个“a”都变成“b”,反之亦然。允许任意数量的列翻转。查找只有“a”或“b”的最大行数

输入的第一行将给出矩阵的维度,其余的行将表示矩阵的每一行

Input:
3 3
a a b
b b b
b b a

Output: 
2
说明: 翻转第3列将使第1行仅包含“a”,并使第2行仅包含“b”

After flipping column 3:
a a a
b b a
b b b
有人能提供这个问题的答案并解释一下吗?提供代码(最好是Java或Python)也会很有帮助

谢谢大家!

  • 每个列最多翻转一次(因为翻转它
    k
    次相当于翻转它
    k mod 2
    次)。因此,有一组列将恰好翻转一次。其余的柱未被触碰

  • 让我们看一看固定行。如果我们希望它只有
    a
    ,我们应该翻转此行中包含
    b
    的所有列(反之亦然)。这就是为什么每行给我们提供了集合:一组列带有
    a
    ,一组列带有
    b
    。很明显,他们从来都不平等

  • 现在我们可以为每行生成两个集合,并找到最频繁的集合。它的出现次数就是答案

  • 下面是一个如何以非常简单的方式实现它的想法:我们不需要显式地生成集合,只需要为每一行生成两个字符串:这一行中所有元素及其补码(补码是指所有
    a
    都被
    b
    替换的字符串,反之亦然)。现在我们只需要找到最频繁的字符串。我们可以使用
    HashMap
    来实现。这是我的密码:

    /**
     * Computes the complement of the string.
     */
    private String getComplement(String string) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < string.length(); i++) {
            builder.append(string.charAt(i) == 'a' ? 'b' : 'a');
        }
        return builder.toString();
    }
    
    /**
     * Solves the problem for the matrix.
     */
    public int getMaxRows(String[] matrix) {
        Map<String, Integer> count = new HashMap<>();
        for (String row : matrix) {
            count.put(row, count.getOrDefault(row, 0) + 1);
            String complement = getComplement(row);
            count.put(complement, count.getOrDefault(complement, 0) + 1);
        }
        return Collections.max(count.values());
    }
    
    /**
    *计算字符串的补码。
    */
    私有字符串getcomplete(字符串字符串){
    StringBuilder=新的StringBuilder();
    对于(int i=0;i
    您尝试过这个吗?看到它的代码会很有帮助。@SalmanMohammed不,我还没有实现它。但是它看起来非常简单(例如,在Java中,我们可以使用
    List
    s的
    HashSet
    )。为什么要增加每行的计数值,而不检查该行中有多少个字符是相同的?@SalmanMohammed A row是String。例如,对于您的输入,
    矩阵
    {“aab”,“bbb”,“bba”}
    @SalmanMohammed是什么让您认为它不正确的?你有一个失败的测试用例吗?