问题:删列造序 ||

给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。

选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符。

比如,有 A = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 A 为["bef", "vyz"]

假设,我们选择了一组删除索引 D,那么在执行删除操作之后,最终得到的数组的元素是按 字典序(A[0] <= A[1] <= A[2] ... <= A[A.length - 1])排列的,然后请你返回 D.length 的最小可能值。

示例 1:

输入:["ca","bb","ac"]
输出:1
解释:
删除第一列后,A = ["a", "b", "c"]。
现在 A 中元素是按字典排列的 (即,A[0] <= A[1] <= A[2])。
我们至少需要进行 1 次删除,因为最初 A 不是按字典序排列的,所以答案是 1。

示例 2:

输入:["xc","yb","za"]
输出:0
解释:
A 的列已经是按字典序排列了,所以我们不需要删除任何东西。
注意 A 的行不需要按字典序排列。
也就是说,A[0][0] <= A[0][1] <= ... 不一定成立。

示例 3:

输入:["zyx","wvu","tsr"]
输出:3
解释:
我们必须删掉每一列。

提示:

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

链接:https://leetcode-cn.com/contest/weekly-contest-114/problems/delete-columns-to-make-sorted-ii/

分析:

目标是删除最小的行数是的剩余是按照字典排序

1.字典排序:从头到尾逐个字符对比,如果相同比下一个,直到有区别或者结束。

azz  < baa

abc < abd

2.如果是多个字符串对比,如果某个已经比出大小,那么没必要看后面的

str1:a?????

str2:a?????

str3:c?????

str1<=str2<str3,后面只需要比较str1 str2

3.如果字符串组中是严格有序的,即没有相等的,就可以直接得出结果

str1:a?????

str2:b?????

str3:c?????

str1<str2<str3,没必要比较后面的。

4,如果不是有序的在需要将该列去除

最终做法即为依次每个string取一个字符,看是否有序以及是否需要继续比下去,

如果无序,删除该列

如果有序,也不需要继续比,返回结果

如果有序,但是需要继续比,那就继续比。

AC Code:

 class Solution {
public:
//dp
int minDeletionSize(vector<string>& A) {
int ret = ;
vector<string> strs;
if (A.size() <= )
{
return ;
}
if (A[].size() < )
{
return ;
}
for (unsigned int i = ; i < A.size(); i++)
{
string tmp = "";
tmp += A[i][];
strs.emplace_back(tmp);
}
int neednextcheck = ;
bool isordered;
isordered = IsOrdered(strs, neednextcheck);
if (isordered == true && neednextcheck == )
{
return ret;
}
if (isordered == false)
{
ret++; for (unsigned int i = ; i < A.size(); i++)
{
string tmp = "";
strs[i]=tmp;
}
}
for (unsigned int i = ; i < A[].size(); i++)
{
vector<string> tmpstrs(strs);
for (unsigned int j = ; j < A.size(); j++)
{
tmpstrs[j] += A[j][i];
}
isordered = IsOrdered(tmpstrs, neednextcheck);
if (isordered == true && neednextcheck == )
{
return ret;
}
if (isordered == false)
{
ret++;
}
else
{
strs = tmpstrs;
}
}
return ret;
}
bool IsOrdered(vector<string> strs,int& neednextcheck)
{
bool ret = true;
vector<string> OrderedStrs(strs);
//string tmp = strs[0];
neednextcheck = ;
for (unsigned int i = ; i < strs.size(); i++)
{
if (strs[i] == strs[i - ])
{
neednextcheck = ;
break;
}
}
sort(OrderedStrs.begin(), OrderedStrs.end());
for (unsigned int i = ; i < strs.size(); i++)
{
if (OrderedStrs[i] != strs[i])
{
return false;
}
} return ret;
}
};

其他:

1,忽略了好多提示,一方面提示有思路上的提示,另一方面可以避免无用功,比如这个,有明确提到A.length A[0].length 都是大于等于1的,取[0]位置的值完全可以直接取的

3,第一code:

 #pragma GCC optimize("O3", "unroll-loops")
// God Help me !!
#include <bits/stdc++.h>
using namespace std;
// #define watch(x) cout << (#x) << " is " << (x) << endl #define FILES freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout)
#define FAST ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define FIXED cout << fixed << setprecision(20)
#define RANDOM srand(time(nullptr))
#define int long long
// #define MOD 1000000007
#define sz(a) (ll)a.size()
#define pll pair<ll,ll>
#define rep(i,a,b) for(int i=(int)a;i<(int)b;i++)
#define sep(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define mll map<int,int>
#define vl vector<int>
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(a) a.begin(),a.end()
#define F first
#define S second
#define endl "\n"
#define MAXN6 3000005
#define MAXN3 3005
#define MAXN5 300005 #define watch(...) ZZ(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void ZZ(const char* name, Arg1&& arg1){std::cerr << name << " = " << arg1 << endl;}
template <typename Arg1, typename... Args>void ZZ(const char* names, Arg1&& arg1, Args&&... args)
{
const char* comma = strchr(names + , ',');
std::cerr.write(names, comma - names) << " = " << arg1;
ZZ(comma, args...);
} class Solution {
public:
int minDeletionSize(vector<string>& A) {
int n = A.size(), m = A[].size();
int ans = ;
vector<string> B;
for (int i = ; i < n; i++) {
B.push_back("");
}
for (int i = ; i < m; i++) {
bool isOk = true;
for (int j = ; j < n; j++) {
if (B[j] == B[j-] && A[j][i] < A[j-][i]) {
isOk = false;
ans++;
break;
}
}
if (isOk) {
for (int j = ; j < n; j++)
B[j] += A[j][i];
}
}
return ans;
}
};

LeetCode955删列造序 ||的更多相关文章

  1. [Swift]LeetCode955. 删列造序 II | Delete Columns to Make Sorted II

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

  2. Leetcode944. Delete Columns to Make Sorted删列造序

    给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等. 选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符. 所余下的字符串行从上往下读形成列. 比如,有 A = ...

  3. [Swift]LeetCode960. 删列造序 III | Delete Columns to Make Sorted III

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

  4. Hive 按某列的部分排序 以及 删列操作

    脑袋果然还是智商不足. 涉及到的小需求: 某个表test 有一列 tc: a字符串+b字符串+c字符串 拼接组成 把test表,按b字符串排序 输出 遇到的问题: select 里面必须包含 orde ...

  5. C#调用存储过程中事务级临时表返回DataTable列乱序解决办法

    string result = strSqlResult.Substring(3).Trim().Replace("\n", "").Replace(" ...

  6. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  7. Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

    leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...

  8. leetcode难题

    4 寻找两个有序数组的中位数       35.9% 困难     10 正则表达式匹配       24.6% 困难     23 合并K个排序链表       47.4% 困难     25 K ...

  9. leetcode 0208

    目录 ✅ 108. 将有序数组转换为二叉搜索树 描述 解答 py [tdo rev 0208]py知识:if not x: 和if x is not None:和if not x is None:使用 ...

随机推荐

  1. 牛客网Java刷题知识点之基本类型的自动转换和基本类型的强制转换

    不多说,直接上干货! TypeConvertDemo.java //自动类型转换 class TypeConvertDemo { public static void main(String[] ar ...

  2. VirtualBox 在Centos 7 中安装增强功能 (共享文件夹)

    1.分配光驱 2.安装相关依赖包 yum install -y bzip2 gcc gcc-devel gcc-c++ gcc-c++-devel make kernel-d 3.创建临时文件夹 mk ...

  3. form中onsubmit的使用

    form 中的onsubmit在点submit按钮时被触发,如果return false;则结果不会被提交到action中去(也就是提交动作不会发生),如果不返回或者返回true,则执行提交动作.(& ...

  4. mybatis + log4j2 问题 java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerWrapper

    root cause java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerWrapper 网上资料比较 ...

  5. 移动开发,Webapp 淘宝手机 rem 布局

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt ="orientationchange"in w ...

  6. [luogu 3369]普通平衡树(fhq_treap)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  7. Java并发(五):并发,迭代器和容器

    在随后的博文中我会继续分析并发包源码,在这里,得分别谈谈容器类和迭代器及其源码,虽然很突兀,但我认为这对于学习Java并发很重要; ConcurrentModificationException: J ...

  8. Retrofit2与RxJava用法大全

    Retrofit2是square公司出品的一个网络请求库,网上有很多相关的介绍.我很久以前都想去研究了,但一直都有各种事情耽搁,现在就让我们一起去捋一捋,这篇主要讲解Retrofit2与RxJava的 ...

  9. 【Android开发笔记】杂项

    Android studio shift+enter : start new line Theme 将     <style name="AppBaseTheme" pare ...

  10. tomcat jvm参数优化

    根据gc(垃圾回收器)的选择,进行参数优化 JVM给了三种选择:串行收集器.并行收集器.并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器. -XX:+Us ...