华为进军短剧市场
近日,华为视频众测一款「短剧大全」快应用,引发「华为将入局短剧赛道」的猜测。
该应用简介为"短剧大全快应用,畅看海量短剧"。
目前该快应用还处于测试阶段。
在更新内容说明中提到:当前短剧数量还较少,以关注功能和体验为主,后续会不断引入新的短剧。
最近两年,短剧市场成为了投资市场的"香饽饽"。
据《2023短剧行业研究报告》显示,2023 年国内共发行了短剧 3000+ 部,市场规模为 373.9 亿元,同比增长 267.65%,预计 2024 年将超 500 亿元,不少机构认为到 2027 年,短剧的国内市场将会破千亿。
在国内外影视行业整体进入调整期的背景下,「一分钟知晓剧情,两分钟情节跌宕,三分钟上演重生复仇」的「时长短,节奏快,情景爽」的短剧正在不断的占领观众的碎片化时间。
虽然目前提到「短剧」大多都还是「霸总爱上我」等狗血网文改编的剧情,消费主力群体也是「制造业里的厂妹们」,但她们的付费意愿很强,愿意按集付费,同时缺乏网盘搜索等能力(毕竟学这些能力的时间都够看好几集了),是天然优质的付费用户。
下沉市场足够大,自然能够支撑起一个行业。
而且随着「短剧」的不断破圈,同时有了「短视频」养起来的用户习惯和基础设施,短剧或许真的是下一个风口。
...
回归主题。
来一道和「华为 OD」相关的题目。
题目描述
平台:LeetCode
题号:784
给定一个字符串 s
,通过将字符串 s
中的每个字母转变大小写,我们可以获得一个新的字符串。
返回所有可能得到的字符串集合。
以任意顺序返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
-
-
s
由小写英文字母、大写英文字母和数字组成
DFS
数据范围为 12
,同时要我们求所有具体方案,容易想到使用 DFS
进行「爆搜」。
我们可以从前往后考虑每个 ,根据 是否为字母进行分情况讨论:
-
若 不是字母,直接保留 -
若 是字母,则有「保留原字母」或「进行大小写转换」两种决策
设计 DFS
函数为 void dfs(int idx, int n, String cur)
:其中
固定为具体方案的长度(即原字符串长度),而 idx
和 cur
分别为当前处理到哪一个
,而 cur
则是当前具体方案。
根据上述分析可知,当
不为字母,将其直接追加到 cur
上,并决策下一个位置
;而当
为字母时,我们可以选择将
追加到 cur
上(保留原字母)或是将
进行翻转后再追加到 cur
上(进行大小写转换)。
最后当我们满足 idx = n
时,说明已经对原字符串的每一位置决策完成,将当前具体方案 cur
加入答案。
❝一些细节:我们可以通过与
❞32
异或来进行大小写转换
Java 代码:
class Solution {
char[] cs;
List<String> ans = new ArrayList<>();
public List<String> letterCasePermutation(String s) {
cs = s.toCharArray();
dfs(0, s.length(), new char[s.length()]);
return ans;
}
void dfs(int idx, int n, char[] cur) {
if (idx == n) {
ans.add(String.valueOf(cur));
return ;
}
cur[idx] = cs[idx];
dfs(idx + 1, n, cur);
if (Character.isLetter(cs[idx])) {
cur[idx] = (char) (cs[idx] ^ 32);
dfs(idx + 1, n, cur);
}
}
}
C++ 代码:
class Solution {
public:
vector<string> ans;
string s;
void dfs(int idx, int n, string cur) {
if (idx == n) {
ans.push_back(cur);
return;
}
cur.push_back(s[idx]);
dfs(idx + 1, n, cur);
if (isalpha(s[idx])) {
cur[idx] = s[idx] ^ 32;
dfs(idx + 1, n, cur);
}
}
vector<string> letterCasePermutation(string s) {
this->s = s;
dfs(0, s.length(), "");
return ans;
}
};
Python 代码:
class Solution:
def letterCasePermutation(self, s: str) -> List[str]:
ans = []
def dfs(idx, n, cur):
if idx == n:
ans.append(cur)
return
dfs(idx + 1, n, cur + s[idx])
if 'a' <= s[idx] <= 'z' or 'A' <= s[idx] <= 'Z':
dfs(idx + 1, n, cur + s[idx].swapcase())
dfs(0, len(s), '')
return ans
TypeScript 代码:
function letterCasePermutation(s: string): string[] {
const ans = new Array<string>()
function dfs(idx: number, n: number, cur: string): void {
if (idx == n) {
ans.push(cur)
return
}
dfs(idx + 1, n, cur + s[idx])
if ((s[idx] >= 'a' && s[idx] <= 'z') || (s[idx] >= 'A' && s[idx] <= 'Z')) {
dfs(idx + 1, n, cur + String.fromCharCode(s.charCodeAt(idx) ^ 32))
}
}
dfs(0, s.length, "")
return ans
}
-
时间复杂度:最坏情况下原串 s
的每一位均为字母(均有保留和转换两种决策),此时具体方案数量共 种;同时每一种具体方案我们都需要用与原串长度相同的复杂度来进行构造。复杂度为 -
空间复杂度:
二进制枚举
根据解法一可知,具体方案的个数与字符串 s1
存在的字母个数相关,当 s1
存在 m
个字母时,由于每个字母存在两种决策,总的方案数个数为 2^m
个。
因此可以使用「二进制枚举」的方式来做:使用变量 s
代表字符串 s1
的字母翻转状态,s
的取值范围为 [0, 1 << m)
。若 s
的第 j
位为 0
代表在 s1
中第 j
个字母不进行翻转,而当为 1
时则代表翻转。
每一个状态 s
对应了一个具体方案,通过枚举所有翻转状态 s
,可构造出所有具体方案。
Java 代码:
class Solution {
public List<String> letterCasePermutation(String str) {
List<String> ans = new ArrayList<String>();
int n = str.length(), m = 0;
for (int i = 0; i < n; i++) m += Character.isLetter(str.charAt(i)) ? 1 : 0;
for (int s = 0; s < (1 << m); s++) {
char[] cs = str.toCharArray();
for (int i = 0, j = 0; i < n; i++) {
if (!Character.isLetter(cs[i])) continue;
cs[i] = ((s >> j) & 1) == 1 ? (char) (cs[i] ^ 32) : cs[i];
j++;
}
ans.add(String.valueOf(cs));
}
return ans;
}
}
C++ 代码:
class Solution {
public:
vector<string> letterCasePermutation(string str) {
vector<string> ans;
int n = str.length(), m = 0;
for (int i = 0; i < n; i++) m += isalpha(str[i]) ? 1 : 0;
for (int s = 0; s < (1 << m); s++) {
string cs = str;
for (int i = 0, j = 0; i < n; i++) {
if (!isalpha(cs[i])) continue;
cs[i] = ((s >> j) & 1) ? (cs[i] ^ 32) : cs[i];
j++;
}
ans.push_back(cs);
}
return ans;
}
};
Python 代码:
class Solution:
def letterCasePermutation(self, s1: str) -> List[str]:
def isLetter(ch):
return 'a' <= ch <= 'z' or 'A' <= ch <= 'Z'
ans = []
n, m = len(s1), len([ch for ch in s1 if isLetter(ch)])
for s in range(1 << m):
cur = ''
j = 0
for i in range(n):
if not isLetter(s1[i]) or not ((s >> j) & 1):
cur += s1[i]
else:
cur += s1[i].swapcase()
if isLetter(s1[i]):
j += 1
ans.append(cur)
return ans
TypeScript 代码:
function letterCasePermutation(str: string): string[] {
function isLetter(ch: string): boolean {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
}
const ans = new Array<string>()
let n = str.length, m = 0
for (let i = 0; i < n; i++) m += isLetter(str[i]) ? 1 : 0
for (let s = 0; s < (1 << m); s++) {
let cur = ''
for (let i = 0, j = 0; i < n; i++) {
if (!isLetter(str[i]) || ((s >> j) & 1) == 0) cur += str[i]
else cur += String.fromCharCode(str.charCodeAt(i) ^ 32)
if (isLetter(str[i])) j++
}
ans.push(cur)
}
return ans
}
-
时间复杂度:最坏情况下原串 s
的每一位均为字母(均有保留和转换两种决策),此时具体方案数量共 种;同时每一种具体方案我们都需要用与原串长度相同的复杂度来进行构造。复杂度为 -
空间复杂度:
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用 ~
📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
专属链接:leetcode.cn/premium/?promoChannel=acoier
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉