LeetCode 43字符串相乘44通配符匹配
原創公眾號:bigsai,回復進群加入力扣打卡群。
字符串相乘
題目描述:
給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。
示例 1:
輸入: num1 = “2”, num2 = “3”
輸出: “6”
示例 2:
輸入: num1 = “123”, num2 = “456”
輸出: “56088”
說明:
num1 和 num2 的長度小于110。
num1 和 num2 只包含數字 0-9。
num1 和 num2 均不以零開頭,除非是數字 0 本身。
不能使用任何標準庫的大數類型(比如 BigInteger)或直接將輸入轉換為整數來處理。
不允許我們使用BigInteger,肯定無法使用常規類型去解決問題了。對應也要使用其他方法去解決問題。
怎么處理我們需要分析這個乘法的底層邏輯到底是怎么樣的。
這樣看這張圖,其算法邏輯應該很清晰了,所以我們在具體處理的時候就用一個int數組用來表示對應位數乘積的值,最后從個位向上進位只保留各位就可以。
你可能會疑問,如果兩個數組的長度分別為a和b這個數組到底該開多大呢?
- a+b大小就夠了,怎么分析呢?其中一個a不變。另一個b變成最小b+1數字即十的倍數,那么這樣在相乘的時候也不過是a+b長度,所以這里a+b長度就夠了。
ac的代碼為:
public String multiply(String num1, String num2) {if("0".equals(num1)||"0".equals(num2))return "0";char a[]=num1.toCharArray();char b[]=num2.toCharArray();int value[]=new int[a.length+b.length];for(int i=a.length-1;i>=0;i--){for(int j=b.length-1;j>=0;j--){int index=a.length-1-i+b.length-1-j;value[index]+=(a[i]-'0')*(b[j]-'0');}}//System.out.println(Arrays.toString(a)+""+Arrays.toString(b)+" "+Arrays.toString(value));for(int i=0;i<value.length-1;i++){value[i+1]+=value[i]/10;value[i]=value[i]%10;}int index=value.length-1;while(value[index]==0){index--;}StringBuilder sBuilder=new StringBuilder();while (index>=0) {sBuilder.append(value[index--]);}return sBuilder.toString();}通配符匹配
這題的話其實和前面的正則表達式很像,但是又略有區別。如果dp[i][j]表示匹配串前i個和模式串j個匹配情況(boolean類型)。核心的狀態轉移方程為:
dp[i][j]=dp[i-1][j-1] (s[i]==p[j]||p[j]=='?') dp[i][j]=dp[i][j-1]||dp[i-1][j] (p[j]=='*'); public boolean isMatch(String s, String p) {int slen=s.length();int plen=p.length();char p1[]=p.toCharArray();char s1[]=s.toCharArray();boolean dp[][]=new boolean[slen+1][plen+1];dp[0][0]=true;for(int i=0;i<plen;i++){if(p1[i]=='*'){dp[0][i+1]=true;}else break;}for(int j=1;j<=plen;j++)//遍歷模式串{for(int i=1;i<=slen;i++)//遍歷匹配串{//相等可以匹配if(p1[j-1]=='?'||s1[i-1]==p1[j-1])//當前單詞可以匹配{dp[i][j]=dp[i-1][j-1];}else if(p1[j-1]=='*')//可以匹配任意多個{dp[i][j]=dp[i][j-1]||dp[i-1][j];}}}//System.out.println(dp[s.length()][p.length()]);return dp[slen][plen];}
至于還有貪心算法和其他優化方案,今天就不更了,下次可能會補更。
本次就到這里啦,感覺不錯記得點贊或一鍵三連哦,個人公眾號:bigsai 回復 bigsai 更多精彩和資源與你分享。
總結
以上是生活随笔為你收集整理的LeetCode 43字符串相乘44通配符匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python写一个豆瓣通用爬虫并可视化
- 下一篇: 1024我摊牌了,谈谈自己2020剩余两