LeetCode 2266.統計打字方案數:排列組合

【LetMeFly】2266.統計打字方案數:排列組合

力扣題目鏈接:https://leetcode.cn/problems/count-number-of-texts/

Alice 在給 Bob 用手機打字。數字到字母的 對應?如下圖所示。

為了 打出?一個字母,Alice 需要 ?對應字母 i?次,i?是該字母在這個按鍵上所處的位置。

  • 比方說,為了按出字母?'s'?,Alice 需要按?'7'?四次。類似的, Alice 需要按?'5'?兩次得到字母??'k'?。
  • 注意,數字?'0' 和?'1'?不映射到任何字母,所以?Alice ?使用它們。

但是,由于傳輸的錯誤,Bob 沒有收到 Alice 打字的字母信息,反而收到了 按鍵的字符串信息?。

  • 比方說,Alice 發出的信息為?"bob"?,Bob 將收到字符串?"2266622"?。

給你一個字符串?pressedKeys?,表示 Bob 收到的字符串,請你返回 Alice 總共可能發出多少種文字信息?。

由于答案可能很大,將它對?109 + 7?取余 后返回。

?

示例 1:

輸入:pressedKeys = "22233"
輸出:8
解釋:
Alice 可能發出的文字信息包括:
"aaadd", "abdd", "badd", "cdd", "aaae", "abe", "bae" 和 "ce" 。
由于總共有 8 種可能的信息,所以我們返回 8 。

示例 2:

輸入:pressedKeys = "222222222222222222222222222222222222"
輸出:82876089
解釋:
總共有 2082876103 種 Alice 可能發出的文字信息。
由于我們需要將答案對 109 + 7 取余,所以我們返回 2082876103 % (109 + 7) = 82876089 。

?

提示:

  • 1 <= pressedKeys.length <= 105
  • pressedKeys 只包含數字?'2'?到?'9'?。

解題方法:排列組合

按鍵2可以按1/2/3次,那么n次連續的按鍵2共有多少種拼寫可能?

使用數組dp3,其中dp3[n]代表連續按2n次有多少種拼寫方案。我們考慮最后一個按出來的字母:

  1. n次按2可以在按了n - 1次的基礎上再按1次(得到a
  2. n次按2可以在按了n - 2次的基礎上連續按2次(得到b
  3. n次按2可以在按了n - 3次的基礎上連續按3次(得到c

因此dp3[n] = (dp3[n - 1] + dp3[n - 2] + dp3[n - 3]) % mod

和按鍵2一樣,按鍵3/4/5/6/8同樣適用于dp3數組;而按鍵7和按鍵9最多可以連按4次,因此可以計算dp4數組:

dp4[n] = (dp4[n - 1] + dp4[n - 2] + dp4[n - 3] + dp4[n - 4]) % mod

給你一個按鍵字符串如22233,我們可以通過一次遍歷很輕松地得到“連按了32,又連按了23”這一信息。

連按32可以有dp3[3]種方案,連按23可以有dp3[2]種方案,因此依據乘法原理,總計有dp3[3] * dp3[2]種方案。

  • 時間復雜度 O ( l e n ( p r e s s e d K e y s ) ) O(len(pressedKeys)) O(len(pressedKeys))
  • 空間復雜度 O ( l e n ( p r e s s e d K e y s ) ) O(len(pressedKeys)) O(len(pressedKeys))

AC代碼

C++
const int mod = 1e9 + 7;
int dp3[100001], dp4[100001];
int init = []() {dp3[0] = dp4[0] = 1;dp3[1] = dp4[1] = 1;dp3[2] = dp4[2] = 2;dp3[3] = dp4[3] = 4;for (int i = 4; i <= 100000; i++) {dp3[i] = ((dp3[i- 1] + dp3[i - 2]) % mod + dp3[i - 3]) % mod;dp4[i] = (((dp4[i - 1] + dp4[i - 2]) % mod + dp4[i - 3]) % mod + dp4[i - 4]) % mod;}return 0;
}();class Solution {
public:int countTexts(string& pressedKeys) {long long ans = 1;int cnt = 0;for (int i = 0; i < pressedKeys.size(); i++) {cnt++;if (i == pressedKeys.size() - 1 || pressedKeys[i] != pressedKeys[i + 1]) {ans = ans * (pressedKeys[i] == '7' || pressedKeys[i] == '9' ? dp4[cnt] : dp3[cnt]) % mod;cnt = 0;}}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-01-19 14:06:29
LastEditors: LetMeFly.xyz
LastEditTime: 2025-01-19 14:16:32
'''
MOD = 1000000007
dp3 = [1, 1, 2, 4] + [0] * 100000
dp4 = [1, 1, 2, 4] + [0] * 100000
for i in range(4, 100001):dp3[i] = (dp3[i - 1] + dp3[i - 2] + dp3[i - 3]) % MODdp4[i] = (dp4[i - 1] + dp4[i - 2] + dp4[i - 3] + dp4[i - 4]) % MODclass Solution:def countTexts(self, pressedKeys: str) -> int:ans = 1cnt = 0for i in range(len(pressedKeys)):cnt += 1if i == len(pressedKeys) - 1 or pressedKeys[i] != pressedKeys[i + 1]:ans = ans * (dp4[cnt] if pressedKeys[i] == '7' or pressedKeys[i] == '9' else dp3[cnt]) % MODcnt = 0return ans
Java
/** @Author: LetMeFly* @Date: 2025-01-19 14:16:55* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-19 14:19:48*/
class Solution {private static final int mod = 1000000007;private static final int[] dp3 = new int[100001];private static final int[] dp4 = new int[100001];static {dp3[0] = dp4[0] = 1;dp3[1] = dp4[1] = 1;dp3[2] = dp4[2] = 2;dp3[3] = dp4[3] = 4;for (int i = 4; i <= 100000; i++) {dp3[i] = ((dp3[i- 1] + dp3[i - 2]) % mod + dp3[i - 3]) % mod;dp4[i] = (((dp4[i - 1] + dp4[i - 2]) % mod + dp4[i - 3]) % mod + dp4[i - 4]) % mod;}}public int countTexts(String pressedKeys) {long ans = 1;int cnt = 0;for (int i = 0; i < pressedKeys.length(); i++) {cnt++;if (i == pressedKeys.length() - 1 || pressedKeys.charAt(i) != pressedKeys.charAt(i + 1)) {ans = ans * (pressedKeys.charAt(i) == '7' || pressedKeys.charAt(i) == '9' ? dp4[cnt] : dp3[cnt]) % mod;cnt = 0;}}return (int)ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-01-19 14:21:47* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-01-19 14:55:32*/
package mainconst mod int = 1000000007
var dp3 = [100001]int{1, 1, 2, 4}
var dp4 = dp3func init() {for i := 4; i <= 100000; i++ {dp3[i] = ((dp3[i- 1] + dp3[i - 2]) % mod + dp3[i - 3]) % mod;dp4[i] = (((dp4[i - 1] + dp4[i - 2]) % mod + dp4[i - 3]) % mod + dp4[i - 4]) % mod;}
}func countTexts(pressedKeys string) int {ans := int64(1)cnt := 0for i, c := range pressedKeys {cnt++if i == len(pressedKeys) - 1 || byte(c) != pressedKeys[i + 1] {if c == '7' || c == '9' {ans = ans * int64(dp4[cnt]) % int64(mod)} else {ans = ans * int64(dp3[cnt]) % int64(mod)}cnt = 0}}return int(ans)
}

同步發文于CSDN和我的個人博客,原創不易,轉載經作者同意后請附上原文鏈接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/145243054

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66444.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PTA乙級1001~1005【c++】

首先講解一下PTA乙級在哪里。PTA乙級題其實就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不償命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

滲透筆記1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自帶 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服務器上&#xff0c;client分別在各地&#xff0c;與server相連接&#xff1b;連接上后就可以共享上線主機。…

用Python實現SVM搭建金融反詐模型(含調試運行)

1.概述 信用卡盜刷一般發生在持卡人信息被不法分子竊取后&#xff0c;復制卡片進行消費或信用卡被他人冒領后激活并消費等情況下。一旦發生信用卡盜刷&#xff0c;持卡人和銀行都會遭受一定的經濟損失。本節要運用支持向量機分類算法搭建一個金融反欺詐模型。 2.數據集 使用…

HunyuanVideo 文生視頻模型實踐

HunyuanVideo 文生視頻模型實踐 flyfish 運行 HunyuanVideo 模型使用文本生成視頻的推薦配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值顯存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本項目適用于使用 N…

第6章 ThreadGroup詳細講解(Java高并發編程詳解:多線程與系統設計)

1.ThreadGroup 與 Thread 在Java程序中&#xff0c; 默認情況下&#xff0c; 新的線程都會被加入到main線程所在的group中&#xff0c; main線程的group名字同線程名。如同線程存在父子關系一樣&#xff0c; Thread Group同樣也存在父子關系。圖6-1就很好地說明了父子thread、父…

nginx常用配置 (含負載均衡、反向代理、限流、Gzip壓縮、圖片防盜鏈 等示例)

nginx的配置文件通常在 /etc/nginx/nginx.conf , /etc/nginx/conf.d/*.conf 中&#xff0c; 一般直接 改 conf.d目錄下的 default.conf文件&#xff0c; 然后 先檢測配置文件是否有錯誤 nginx -t 再重新加載配置文件 或 重啟nginx&#xff0c;命令如下 nginx -s reload 或…

Python編程與在線醫療平臺數據挖掘與數據應用交互性研究

一、引言 1.1 研究背景與意義 在互聯網技術飛速發展的當下,在線醫療平臺如雨后春筍般涌現,為人們的就醫方式帶來了重大變革。這些平臺打破了傳統醫療服務在時間和空間上的限制,使患者能夠更加便捷地獲取醫療資源。據相關報告顯示,中國基于互聯網的醫療保健行業已進入新的…

Linux網絡_套接字_UDP網絡_TCP網絡

一.UDP網絡 1.socket()創建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET網絡 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;適用于 IPv4 協議。用于網絡通信AF_INET6&#xff1a;IPv6 地址族&a…

1 行命令引發的 Go 應用崩潰

一、前言 不久前&#xff0c;阿里云 ARMS 團隊、編譯器團隊、MSE 團隊攜手合作&#xff0c;共同發布并開源了 Go 語言的編譯時自動插樁技術。該技術以其零侵入的特性&#xff0c;為 Go 應用提供了與 Java 監控能力相媲美的解決方案。開發者只需將 go build 替換為新編譯命令 o…

R語言的并發編程

R語言的并發編程 引言 在現代計算中&#xff0c;如何有效地利用計算資源進行數據處理和分析已成為一個重要的研究方向。尤其在大數據時代&#xff0c;數據量的急劇增加讓單線程處理方式顯得力不從心。為了解決這一問題&#xff0c;各種編程語言都開展了并發編程的研究和應用。…

Flink(十):DataStream API (七) 狀態

1. 狀態的定義 在 Apache Flink 中&#xff0c;狀態&#xff08;State&#xff09; 是指在數據流處理過程中需要持久化和追蹤的中間數據&#xff0c;它允許 Flink 在處理事件時保持上下文信息&#xff0c;從而支持復雜的流式計算任務&#xff0c;如聚合、窗口計算、聯接等。狀…

C#項目生成時提示缺少引用

問題描述 剛從git或svn拉取下來的C#項目&#xff0c;在VS生成時提示缺少引用 解決方案 1、從“管理NuGet程序包”中下載并安裝缺少的引用&#xff0c;如果引用較多逐個下載安裝會比較麻煩&#xff0c;建議采用下面第2種方案處理 2、通過命令對所有缺少引用進行安裝 &#…

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成 1所有的材料都可以在EAMM: One-Shot Emotional Talking Face via Audio-Based Emotion-Aware Motion Model網站上找到。 摘要 盡管音頻驅動的對話人臉生成技術已取得顯著進展&#xff0c;但現有方法要么忽…

BeanFactory 是什么?它與 ApplicationContext 有什么區別?

談到Spring&#xff0c;那勢必要講講容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么&#xff1f; BeanFactory&#xff0c;其實就是 Spring 容器&#xff0c;用于管理和操作 Spring 容器中的 Bean。可能此時又有初學的小伙伴會問&#xff1a;Bean 是什么&#x…

【深度學習】Huber Loss詳解

文章目錄 1. Huber Loss 原理詳解2. Pytorch 代碼詳解3.與 MSELoss、MAELoss 區別及各自優缺點3.1 MSELoss 均方誤差損失3.2 MAELoss 平均絕對誤差損失3.3 Huber Loss 4. 總結4.1 優化平滑4.2 梯度較好4.3 為什么說 MSE 是平滑的 1. Huber Loss 原理詳解 Huber Loss 是一種結合…

python實現pdf轉word和excel

一、引言   在辦公中&#xff0c;我們經常遇收到pdf文件格式&#xff0c;因為pdf格式文件不易修改&#xff0c;當我們需要編輯這些pdf文件時&#xff0c;經常需要開通會員或收費功能才能使用編輯功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python編程實現…

【PyCharm】連接Jupyter Notebook

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 【PyCharm】連接Jupyter Notebook PyCharm連接Jupyter Notebook的過程可以根據不同的需求分為 本地連接 和 遠程連…

Java鎖 公平鎖和非公平鎖 ReentrantLock() 深入源碼解析

賣票問題 我們現在有五個售票員 五個線程分別賣票 賣票 ReentrantLock(); 運行后全是 a 對象獲取 非公平鎖缺點之一 容易出現鎖饑餓 默認是使用的非公平鎖 也可以傳入一個 true 參數 使其變成公平鎖 生活中排隊講求先來后到 視為公平 程序中的公平性也是符合請求鎖的絕對…

「劉一哥GIS」系列專欄《GRASS GIS零基礎入門實驗教程(配套案例數據)》專欄上線了

「劉一哥GIS」系列專欄《GRASS GIS零基礎入門實驗教程》全新上線了&#xff0c;歡迎廣大GISer朋友關注&#xff0c;一起探索GIS奧秘&#xff0c;分享GIS價值&#xff01; 本專欄以實戰案例的形式&#xff0c;深入淺出地介紹了GRASS GIS的基本使用方法&#xff0c;用一個個實例講…

企業級NoSQL數據庫Redis

1.瀏覽器緩存過期機制 1.1 最后修改時間 last-modified 瀏覽器緩存機制是優化網頁加載速度和減少服務器負載的重要手段。以下是關于瀏覽器緩存過期機制、Last-Modified 和 ETag 的詳細講解&#xff1a; 一、Last-Modified 頭部 定義&#xff1a;Last-Modified 表示服務器上資源…