问题:删列造序 ||

给定由 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. 弹层组件文档 - layui.layer

    http://www.layui.com/doc/modules/layer.html

  2. Ubuntu同屏多终端

    sudo apt-get install terminator

  3. The bytes/str dichotomy in Python 3 [transport]

    reference and transporting from: http://eli.thegreenplace.net/2012/01/30/the-bytesstr-dichotomy-in-p ...

  4. 行高:line-height图文解析

    行高——line-height 初入前端的时候觉得CSS知道display.position.float就可以在布局上游刃有余了,随着以后工作问题层出不穷,才逐渐了解到CSS并不是几个style属性那 ...

  5. Java中的Enum(枚举)用法介绍

    1. 关于Java Enum:学过C/C++等语言的人,应该都对Enum类型略知一二.Enum一般用来表示一组相同类型的常量.如性别.日期.月份.颜色等.对这些属性用常量的好处是显而易见的,不仅可以保 ...

  6. Windows安全认证是如何进行的?[NTLM篇]

    <上篇>中我们介绍Kerberos认证的整个流程.在允许的环境下,Kerberos是首选的认证方式.在这之前,Windows主要采用另一种认证协议——NTLM(NT Lan Manager ...

  7. 使用PM2守护Node.js应用

    PM2简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单.   安装PM2 $ npm install pm2 -g ...

  8. File 元素 都有files属性

    File 元素 都有files属性 必须有 name 才能传到后台 Html data-* 存储string 值 Jquery data() 可以存储对象 ,但是执行后页面看不到,可以取到     P ...

  9. 1 误删dbf文件造成ORA-01109: 数据库未打开.

    1.cmd-sqlplus /nolog-conn system/pwd as sysdba 2.shutdown immediate; 3.startup mount; 4.alter databa ...

  10. WPF动画的几种模式

    最近在用WPF做简单动画,以下是几点经验总结: 1. 使用DispatcherTimer做动画 VB6的年代大家就用Timer做动画了,不用多解释,这个DispatcherTimer和本身的Timer ...