原创公众号: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 更多精彩和资源与你分享。