嘗試用有限狀態機解決一道算法題


  • 有限狀態機(Finite-State Machine)

    有限狀態機是一種數學模型,我理解的有限狀態機的狀態是表示做一件事情的不同階段,條件和行為就是在不同階段采取什么樣的措施能達到下一階段。

    有限狀態機分為有四個概念:初態,現態,次態,終態,條件,行為;

    初態就是啟動狀態,現態就是當前狀態,次態就是將要跳轉到的下一個狀態,每個FSM肯定有一個終態不然不能成為有限,條件就是狀態跳轉的條件,行為就是跳轉到下一狀態實施的動作。

    例如電梯,從1樓到9樓它是在運行上升這個狀態,而促使它停止的條件就是在1-9之間按下上行按鍵,它就會從運行狀態變為停止在某樓層的狀態。如果按下下行按鈕就會等到它上升到最高樓層改變為下行的時候才會停留在某層。

  • Beautiful String

    描述:

       We say a string is beautiful if it has the equal amount of 3 or more continuous letters (in increasing order.)

       Here are some example of valid beautiful strings: "abc", "cde", "aabbcc", "aaabbbccc".

       Here are some example of invalid beautiful strings: "abd", "cba", "aabbc", "zab".

       Given a string of alphabets containing only lowercase alphabets (a-z), output "YES" if the string contains a beautiful sub-string, otherwise output "NO".

    這個題目的意思是,形如abc,aabbcc這種連續的升序的並且長度為3個以上的是beautiful string,給定一個字符串,查找它是否包含beautiful string。

    而我只注重如何計算,輸入形式沒有編寫。

    有限狀態機這個思路是看網上博客的,但是他們並沒有分析如何設計有限狀態機。在分析的過程中,我們按着模型的特性來分析,比如讀到一個字符串時候,狀態機該做何反應,狀態該如何切換。

    我設計的有限狀態機是按照它處理的字符為BS的第幾個為界的,讀到字符我們感興趣的只有兩個事件:當前字符與上一字符是相同的、當前字符是上一字符的+1,其余都是不感興趣的事件。而在這兩個事件里面,又存在index划分問題,比如它是BS的第一位,讀到相同怎么處理,讀到+1怎么處理。

    代碼如下:  

package stateMachine;
/**
 * 規則:升序的小寫字母,並且數目一致且字符數目大於3的的連續子串為Beauty String
 *         比如 abc,aabbcc,abcd等
 * 檢查字符串中是否包含有BS
 * @author MacBook
 * 狀態機:現態,次態,條件,動作
 * 1.當前字符;2.當前字符的數目;3.前一字符的數目;4.當前字符為第幾個字符;
 * 
 * 檢查字符串時候會發生:當前字符與上一字符相等、當前字符為上一字符+1、其他;
 * 
 * 當前字符與上一字符相等:1.第一位字符串,則count++;2.第二位字符串,則檢查pre_num,若大於地index=1;3.第三位字符,若count不等於pre_num則countinue,等則break並設置result為true;
 * 當前字符為上一字符+1:1.index=1,則直接設置index=2並拷貝1所得信息;2.index=2,則拷貝信息后設置index=3;3.index=3,則檢查是否count==pre_num,相等則result=true,否則設置為第index=2,拷貝信息;
 * 
 */
public class BeautyString {
    public static void main(String[] args) {
        new BeautyString().counting("aaab");
    }
    public void counting(String s){
        state Machine = new state();
        boolean result = false;
        Machine.setCurrent(s.charAt(0));
        Machine.setIndex(1);
        Machine.setCount(1);
        for(int i=1;i<s.length();i++){
            //當前字符與上一字符相同的時候
            if(Machine.getCurrent() == s.charAt(i)){
                Machine.setCount(Machine.getCount()+1);
                if(Machine.getIndex() == 1)
                    continue;
                else if(Machine.getIndex() == 2){
                    if(Machine.getPre_num() < Machine.getCount())
                    {
                        Machine.setPre_num(0);
                        Machine.setIndex(1);
                    }
                }else if(Machine.getIndex() == 3){
                    if(Machine.getCount() == Machine.getPre_num())
                    {
                        result = true;
                        System.out.println("條件1");
                        break;
                    }
                }
            //當前字符為上一字符+1的時候
            }else if(Machine.getCurrent() == s.charAt(i) - 1){
                if(Machine.index == 1){
                    Machine.setCurrent(s.charAt(i));
                    Machine.setPre_num(Machine.getCount());
                    Machine.setCount(1);
                    Machine.setIndex(2);
                }else if(Machine.index == 2){
                    Machine.setCurrent(s.charAt(i));
                    Machine.setPre_num(Machine.getCount());
                    Machine.setCount(1);
                    Machine.setIndex(3);
                    if(Machine.getCount() == Machine.getPre_num())
                    {
                        result = true;
                        System.out.println("條件2");
                        break;
                    }
                }else if(Machine.index == 3){
                    if(Machine.getCount() == Machine.getPre_num())
                    {
                        result = true;
                        System.out.println("條件3");
                        break;
                    }else{
                        Machine.setCurrent(s.charAt(i));
                        Machine.setPre_num(Machine.getCount());
                        Machine.setCount(1);
                        Machine.setIndex(2);
                    }
                }
            //其他
            }else{
                Machine.setCurrent(s.charAt(i));
                Machine.setIndex(1);
                Machine.setCount(1);
            }
            System.out.println(Machine.getCurrent()+" "+Machine.getCount()+" "+Machine.getPre_num()+" "+Machine.getIndex());
        }
        System.out.println(result);
    }
}
//狀態機
class state{
    char current;
    int pre_num;
    int count;
    int index;
    public char getCurrent() {
        return current;
    }
    public void setCurrent(char current) {
        this.current = current;
    }
    public int getPre_num() {
        return pre_num;
    }
    public void setPre_num(int pre_num) {
        this.pre_num = pre_num;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM