944. Delete Columns to Make Sorted

  • Hardness: \(\color{green}\textsf{Easy}\)
  • Ralated Topics: ArrayString

一、題目

You are given an array of n string strs, all of the same length.
The string s can be arranged such that there is one on each line, making a grid. For example, strs = ["abc", "bce", "cae" can be arranged as :

abc
bce
cae

You want to delete the columns that are not sorted lexicographically. In the aove example (0-indexed), columns 0('a','b','c') and 2('c','e','e') are sorted while column 1('b','c','a') is not, so you would delete column 1.
Return the number of columns that you will delete.

Example 1:

  • Input: strs = [“cba”,“daf”,“ghi”]
  • Output: 1
  • Explanation: The grid looks as follows:
    cba
    daf
    ghi
    Columns 0 and 2 are sorted, but column 1 is not, so you only need to delete 1 column.

Example 2:

  • Input: strs = [“a”,“b”]
  • Output: 0
  • Explanation: The grid looks as follows:
    a
    b
    Column 0 is the only column and is sorted, so you will not delete any columns.

Example 3:

  • Input: strs = [“zyx”,“wvu”,“tsr”]
  • Output: 3
  • Explanation: The grid looks as follows:
    zyx
    wvu
    tsr
    All 3 columns are not sorted, so you will delete 3.

Constraints:

  • n == strs.length
  • 1 <= n <= 100
  • 1 <= strs[i].length <= 1000

二、分析

  • 根據題意,逐個檢查是否字元有隨著列增加而呈 lexicographically sorted
  • 注意迴圈的走法,若是外圈為欄,內圈為列的話,在發現沒有排序時,可以提早跳出,加快速度。

三、解題

1. String

  • Time complexity: \(O(m\times n)\)
  • Space complexity: \(O(1)\)
int minDeletionSize(vector<string>& strs) {
    int m = strs.size(), n = strs[0].size();
    int cnt = 0;
    for (int col = 0; col < n; ++col) {
        for (int row = 1; row < m; ++row) {
            if (strs[row-1][col] > strs[row][col]) {
                cnt++;
                break;
            }
        }
    }
    return cnt;
}

回目錄 Catalog