9.27 枚举|前缀和dp|正则shell
lc193 电话号码
shell正则
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-([0-9]{4})$/' file.txt
4. grep与awk
- grep 命令: grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
- awk/gawk 命令: awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt 或者 gawk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
5. 附加快速查看表
为了方便查看,列出对应的特殊字符表以及表达方式
特殊字符、转义及特殊含义
特殊字符 转义表达 特殊含义
() \(\) 标记一个子表达式的开始和结束位置,子表达式可后续使用
$ \$ 匹配输入字符串的结尾位置
* \* 匹配前面的子表达式零次或多次
+ \+ 匹配前面的子表达式一次或多次
. \. 匹配除换行符 \n 之外的任何单字符
[] \[ \] 标记一个中括号表达式的开始,要匹配 [ 请使用 \[
? \? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
` ` |
^ \^ 匹配输入字符串的开始位置;在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合
{} \{\} 标记限定符表达式的开始
` ` |
限定符表达及出现次数
限定符 表达 出现次数
* 出现次数 >= 0
+ 出现次数 >= 1
? 出现次数 0 or 1,等价 {0,1}
{n} 出现次数 = n
{n,} 出现次数 >= n
{n, m} n <= 出现次数 <= m
定位符表达及含义
定位符 表达 含义
^ 字符串开始的位置
$ 字符串结束的位置
\b 限定单词(字)的字符,常用来确定一个单词,可结合两个 \b 使用
\B 限定非单词(字)边界的字符,用的很少
lc195 shell查找第十行
awk
sed
tail
sed -n 10p file.txt
# sed “是流编辑器,逐行处理文件”
# -n “禁用默认输出功能。默认情况下,sed 会处理每一行并输出结果,加上 -n 后,只有显式指定的内容才会输出”
# 10p “10 指匹配文件的第 10 行。 p 是打印匹配的行内容”
# file.txt “输入文件”
lc812
class Solution {
public:
double largestTriangleArea(vector<vector<int>>& points) {
const int N = points.size();
double res = 0;
for (int i = 0; i < N - 2; i ++) {
for (int j = i + 1; j < N - 1; j ++) {
for (int k = j + 1; k < N; k ++) {
auto& point1 = points[i];
auto& point2 = points[j];
auto& point3 = points[k];
int x1 = point1[0], y1 = point1[1];
int x2 = point2[0], y2 = point2[1];
int x3 = point3[0], y3 = point3[1];
res = max(res, 0.5 * abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)));
}
}
}
return res;
}
};
lc689
前缀和dp+枚举中间
再分别找出每个位置左边、右边最大的k长度子数组和及起始位置
最后遍历 枚举中间子数组位置,找三个不重叠k长子数组和最大的起始位置组合并返回
class Solution {
public:
vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
int n = nums.size();
vector<int> s(n + 1, 0);
for (int i = 0; i < n; ++i) {
s[i + 1] = s[i] + nums[i];
}
vector<vector<int>> pre(n, vector<int>(2, 0));
vector<vector<int>> suf(n, vector<int>(2, 0));
for (int i = 0, t = 0, idx = 0; i < n - k + 1; ++i) {
int cur = s[i + k] - s[i];
if (cur > t) {
pre[i + k - 1] = {cur, i};
t = cur;
idx = i;
} else
pre[i + k - 1] = {t, idx};
}
for (int i = n - k, t = 0, idx = 0; i >= 0; --i) {
int cur = s[i + k] - s[i];
if (cur >= t) {
suf[i] = {cur, i};
t = cur;
idx = i;
} else {
suf[i] = {t, idx};
}
}
vector<int> ans;
for (int i = k, t = 0; i < n - 2 * k + 1; ++i)
{
int cur = s[i + k] - s[i] + pre[i - 1][0] + suf[i + k][0];
if (cur > t) {
ans = {pre[i - 1][1], i, suf[i + k][1]};
t = cur;
}
}
return ans;
}
};