35 Delete Columns to Make Sorted

题目

We are given an array A of N lowercase letter strings, all of the same length.

Now, we may choose any set of deletion indices, and for each string, we delete all the characters in those indices.

For example, if we have an array A = [“abcdef”,“uvwxyz”] and deletion indices {0, 2, 3}, then the final array after deletions is [“bef”, “vyz”], and the remaining columns of A are [“b”,“v”], [“e”,“y”], and [“f”,“z”]. (Formally, the c-th column is [A[0][c], A[1][c], …, A[A.length-1][c]].)

Suppose we chose a set of deletion indices D such that after deletions, each remaining column in A is in non-decreasing sorted order.

Return the minimum possible value of D.length.

Example 1:

Input: [“cba”,“daf”,“ghi”]
Output: 1
Explanation:
After choosing D = {1}, each column [“c”,“d”,“g”] and [“a”,“f”,“i”] are in non-decreasing sorted order.
If we chose D = {}, then a column [“b”,“a”,“h”] would not be in non-decreasing sorted order.

Example 2:

Input: [“a”,“b”]
Output: 0
Explanation: D = {}

Example 3:

Input: [“zyx”,“wvu”,“tsr”]
Output: 3
Explanation: D = {0, 1, 2}

Note:

1 <= A.length <= 100
1 <= A[i].length <= 1000

分析

题意,建议直接看example。给定一个字符串数组,里面的每个字符串都有相同长度,每个字符串相同位置的字母称为一组,如[“ab”,“cd”],则ac为一组、bd为一组。求出“删除最少组数的字符串,让每组保持递增”。如[“cba”,“daf”,“ghi”],删除bah这一组之后,其他组都是递增的,因此最少组数是1。

思路:
拿到每个字符串中的字符,如果前后非递增,则结果++;

解答

class Solution {
    public int minDeletionSize(String[] A) {
        int ans = 0;
        // 拿到每个字符串字母
        for (int c = 0; c < A[0].length(); ++c)
        	// 拿到每个字符串
            for (int r = 0; r < A.length - 1; ++r)
            	// 如果当前比后一个大(递减),则ans++,并跳过当前字符串
                if (A[r].charAt(c) > A[r+1].charAt(c)) {
                    ans++;
                    break;
                }

        return ans;
    }
}

比较特别的是,常见的双层遍历都是外层为行内层为列,此处使用的是外层为列内层为行。因为,此处有这个需求:当需要break或continue外层循环的时候,可以把内外循环交换。此处由于需要在条件满足时跳过行,而直接写break,只会断开内层循环。因此,此处是外层为列,内层为行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章