KMP模式匹配算法实现-简单例子

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class StringMatch extends JFrame  {
    
      TextField tf1;//文本框1,大字符串
      TextField tf2;//文本框2,指定匹配的字符串
      TextField tf3;//文本框3,输入从第几个字符开始匹配
      JButton jb;//按钮
      JLabel lab1,lab2,lab3,lab4,lab5;//标签
      JPanel panel1,panel2,panel3;//面板
      String str,s;//大字符串,指定需要匹配的字符串
      int pos;//开始匹配的起始位置
      StringMatch(){
          //初始化组件
         
          tf1=new TextField(10);
          tf2=new TextField(5);
          tf3=new TextField(3);
          lab1=new JLabel("请输入一串英文字符(不超过10个字符)");
          lab2=new JLabel("请输入一串英文字符(不超过5个字符)");
          //返回匹配结果
          lab3=new JLabel("单击按钮,输出是否匹配以及匹配的字符串下标");
          lab5=new JLabel("输入开始匹配的起始位置");
          //按钮
          jb=new JButton();
          jb.setPreferredSize(new Dimension(100, 25));
        //  seticon(jb);
          jb.setText("确定");
          
          lab4=new JLabel("结果是:");
          FlowLayout fl=new FlowLayout(FlowLayout.LEFT,10,10);
          GridLayout gr=new GridLayout(3,1);
          
          
          
          
          //面板1 
          panel1=new JPanel();
          panel1.add(lab1);
          panel1.add(tf1);
          panel1.setLayout(gr);
          add(panel1);//水平间距,垂直间距
          
          //面板2
          panel2=new JPanel();
          panel2.add(lab2);
          panel2.add(tf2);
          panel2.add(lab5);
          panel2.add(tf3);
          panel2.setLayout(gr);
          add(panel2);
         
          //面板3
          panel3=new JPanel();
          panel3.add(lab3);
          panel3.add(jb);
          panel3.add(lab4);
          panel3.setLayout(fl);
          add(panel3);      
          
          //监听按钮事件
          jb.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  if(tf1.getText().length()==0 || tf2.getText().length()==0 || tf3.getText().length()==0)
                      JOptionPane.showMessageDialog(null,"需输入字符!","警告",JOptionPane.WARNING_MESSAGE);
                  else
                  Match(e);
              }
          });
          
         
          
      }
      //给按钮设置合适的图片
      public void seticon(JButton jb){
         ImageIcon ic=new ImageIcon("D:\\eclipse-java-neon-3-win32-x86_64\\eclipse\\workspace\\Java-exercise\\src\\q-4.jpg");
         Image temp=ic.getImage().getScaledInstance(80,50,ic.getImage().SCALE_DEFAULT);
         ic=new ImageIcon(temp);
         jb.setIcon(ic);
      }
      
      public void Match(ActionEvent e){
          str=tf1.getText();
          s=tf2.getText();
          pos=Integer.parseInt(tf3.getText());
          if(e.getActionCommand().equals("确定")){
              //返回匹配结果
            
             lab4.setText("结果是:"+String.valueOf(Index_KMP(str,s,pos)));
              
          }
          
      }
      //匹配算法
      public int Index_KMP(String S,String T,int pos){
          int lenS=S.length();
          int lenT=T.length();
          int i=pos;
          int j=0;
          int[] next=new int[255];
          //字符串转换成字符数组
          char[] Str=S.toCharArray();
          char[] Ttr=T.toCharArray();
          next=get_nextval(T,next);
          //循环
          while(i<lenS && j<lenT){
              if((j==-1) || Str[i]==Ttr[j]){
                  ++i;
                  ++j;
              }else
              {
                  j=next[j];
              }
          }
          if(j==lenT)
              return i-lenT;
          else
              return -1;
      }

      //匹配算法的next数组改进
      public int[] get_nextval(String T,int[] nextval){
          int i,j;
          int lenT=T.length();
          char[] Ttr=T.toCharArray();
          i=0;
          j=-1;
          nextval[0]=-1;
          while(i<lenT-1){
              if(j==-1 || Ttr[i]==Ttr[j] ){
                  ++i;
                  ++j;
                  if(Ttr[i]!=Ttr[j])nextval[i]=j;
                  else
                      nextval[i]=nextval[j];
              }
              else
                  j=nextval[j];
          }
          return nextval;
      }
      
      public static void main(String[] args){
          StringMatch sm=new StringMatch();
          sm.setBounds(300,300,400,250);
          sm.setResizable(false);
            sm.setVisible(true);
            sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            GridLayout grid=new GridLayout(3,3);
            sm.setLayout(grid);
      }
}

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_35767107/article/details/81083353