解答:
此题是动态规划类问题,假设dp[i][j]表示为为 s[0..i]与p[0...j]是否匹配,则代码如下:
import java.util.Scanner;
/**
* 字符串匹配
* @author Dell
*
*/
public class Test4 {
public static boolean isMatch(String s, String p)
{
if(p.length()==0)
{
if(s.length()==0) return true;
else
return false;
}
boolean[][] dp=new boolean[s.length()+1][p.length()+1];
dp[0][0]=true;
for(int i=1;i<=p.length();i++)
{
if(p.charAt(i-1)=='*')
dp[0][i]=dp[0][i-1];
}
for(int i=1;i<=s.length();i++)
{
for(int j=1;j<=p.length();j++)
{
if(s.charAt(i-1)==p.charAt(j-1)||p.charAt(j-1)=='?')
dp[i][j]=dp[i-1][j-1];
if(p.charAt(j-1)=='*')
dp[i][j]=dp[i-1][j]||dp[i][j-1]; //比较难想
}
}
return dp[s.length()][p.length()];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
String p=sc.nextLine();
System.out.println(isMatch(s,p));
}
}
}
2:类似于逆波兰表达式的题,只是附加了一些条件,比如栈的空间最大为16,当压栈的整数超过16,则返回-2;当栈为空时再从栈中弹出数据要返回-1;此外,逆波兰表达式中的空格表示分隔符,可以有多个空格。
解答:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Test2 {
public static int resolve(String expr)
{
Stack<Integer> s=new Stack<>();
String[] s1=expr.split(" ");
ArrayList<String> list=new ArrayList<>();
for(int i=0;i<s1.length;i++)
{
if(s1[i]!=" ")
{
list.add(s1[i]);
}
}
for(int i=0;i<list.size();i++)
{
String t=list.get(i);
try {
int temp=Integer.parseInt(t);
if(s.size()<16)
{
s.push(temp);
}
else
{
return -2;
}
} catch (NumberFormatException e) {
if(t.equals("^"))
{
if(s.size()>=1)
{
int a=s.pop();
a++;
s.push(a);
}
else
return -1;
}
else if(t.equals("+"))
{
if(s.size()>=2)
{
int a=s.pop();
int b=s.pop();
int c=a+b;
s.push(c);
}
else
{
return -1;
}
}
else
{
if(s.size()>=2)
{
int a=s.pop();
int b=s.pop();
int c=a*b;
s.push(c);
}
else
{
return -1;
}
}
}
}
return s.pop();
}
public static void main(String[] args) {
ArrayList<Integer> inputs=new ArrayList<Integer>();
Scanner in=new Scanner(System.in);
String line=in.nextLine();
if(line!=null&&!line.isEmpty())
{
int res=resolve(line.trim());
System.out.println(String.valueOf(res));
}
}
}