问题:删列造序 ||

给定由 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. lecture-7 递归

    1.例题--排列 Permutation Given a collection of distinct numbers, return all possible permutations.For ex ...

  2. 《从0到1学习Flink》—— Data Sink 介绍

    前言 再上一篇文章中 <从0到1学习Flink>-- Data Source 介绍 讲解了 Flink Data Source ,那么这里就来讲讲 Flink Data Sink 吧. 首 ...

  3. 配置Spring发送邮件

    推荐查看原博客        转载自:配置Spring发送邮件 Spring Email抽象的核心是MailSender接口.顾名思义,MailSender的实现能够通过连接Email服务器实现邮件发 ...

  4. Spring和springMVC父子容器的关系

    部分转载自:https://www.cnblogs.com/ljdblog/p/7461854.html springMVC容器和Spring容器 为什么一定要在web.xml中配置spring的li ...

  5. sqlserver2008执行200M以上的大脚本文件,打开脚本总是报“未能完成操作,存储空间不足”

    用sqlcmd命令行工具. 1.win7下快捷键:win+R 2.输入cmd​,确定 3.输入命令:sqlcmd -S <数据库> -i C:\<数据文件>.sql 例:sql ...

  6. log4net 最快速体验

    本文供实习司机快速上手log4net最基本功能,共4步,3分钟搞定. 一.添加log4net.dll引用,可使用nuget安装或直接引用文件 二.添加配置 在app.config或web.config ...

  7. Laravel事件监听器listener与事件订阅者Subscriber的区别

    其实就一句话: Each event can have multiple listeners, but a listener can't listen to more than a single ev ...

  8. mockJs语法糖用例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. CSS文档优化

    首先了解下CSS的渲染逻辑,它是从标记的最后一位开始搜索的,例如:.myclass li a,首选它会遍历所有的<a>,然后看哪些<a>之前有<li>,然后再看哪些 ...

  10. SpringEL和资源调用

    Spring EL-Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL表达式语言. Spring开发中经常涉及调用各种资源的情况,包含普通文件.网址.配置文件.系统环境变量等, ...