824. Goat Latin

本文介绍了一种处理字符串的方法——Goat Latin,通过遍历输入字符串并根据特定规则修改每个单词,最终生成新的字符串。对于以元音开头的单词,直接在其后添加'ma'及相应数量的'a';对于辅音开头的单词,则将第一个字母移到末尾再添加'ma'及相应数量的'a'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题原文链接:

点击打开链接

问题思路很简单,就是使用StringBuilder words变量存储每个单词。至于单词的后缀“a”也是使用变量去储存,遇到空格增加一个“a”。代码如下:

    public String toGoatLatin(String S) {
        StringBuilder sentence = new StringBuilder();//返回的句子
        StringBuilder words = new StringBuilder();//单词储存器
        String postfix = "";//每个单词的后缀,遇到空格就+a
        //对字符串进行遍历,遇到空格就把上一个单词添加到sentence,不要忘记添加空格
        for (int i = 0;i<S.length();i++){
            if (S.charAt(i) !=  ' '&& i != S.length()-1){
                words.append(S.charAt(i));
                continue; }
            if (i == S.length()-1)
                words.append(S.charAt(i));

            postfix+="a";
            int length = words.length();
            //对单词首字符进行判断
            if (words.charAt(0) == 'a'||words.charAt(0) == 'e'|| words.charAt(0) == 'i' ||
                    words.charAt(0) == 'o'||words.charAt(0) == 'u'||words.charAt(0) == 'A'||words.charAt(0) == 'E'|| words.charAt(0) == 'I' ||
                    words.charAt(0) == 'O'||words.charAt(0) == 'U'){
                words.append("ma").append(postfix);
                sentence.append(words).append(" ");
                words = new StringBuilder();//对单词储存器进行清空,以便下一个单词使用
            }else{
                words.append(words.charAt(0)).append("ma").append(postfix);
                words.deleteCharAt(0);
                /*
                *不使用库函数
                * StringBuilder tmp="";
                *for(int i = 1;i<words.length();i++){
                *   tmp.append(words.charat(i));}
                * */
                sentence.append(words).append(" ");
                words = new StringBuilder();
            }
        }
        return sentence.toString().substring(0,sentence.length()-1);
        /*
        * 不使用库函数,同理上述
        * */
    }

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_STATES 16 // 总共有2^4=16种状态 // 定义状态结构 typedef struct { int farmer; int wolf; int goat; int cabbage; } State; // 定义队列节点结构 typedef struct { State state; int parent; int step; char action[50]; } QueueNode; // 定义队列 QueueNode queue[MAX_STATES]; int front = 0, rear = 0; // 检查状态是否安全 bool is_safe(State s) { if (s.farmer != s.goat && (s.goat == s.wolf || s.goat == s.cabbage)) { return false; } return true; } // 检查状态是否为目标状态 bool is_goal(State s) { return s.farmer == 1 && s.wolf == 1 && s.goat == 1 && s.cabbage == 1; } // 检查状态是否已经访问过 bool is_visited(State s, State visited[], int count) { for (int i = 0; i < count; i++) { if (visited[i].farmer == s.farmer && visited[i].wolf == s.wolf && visited[i].goat == s.goat && visited[i].cabbage == s.cabbage) { return true; } } return false; } // 打印步骤 void print_step(QueueNode node) { printf("步骤%d: %s\n", node.step, node.action); printf("状态: 农夫: %s, 狼: %s, 羊: %s, 白菜: %s\n", node.state.farmer ? "北岸" : "南岸", node.state.wolf ? "北岸" : "南岸", node.state.goat ? "北岸" : "南岸", node.state.cabbage ? "北岸" : "南岸"); } // 打印解决方案 void print_solution(int index) { if (index == -1) return; print_solution(queue[index].parent); print_step(queue[index]); } // 广度优先搜索 void bfs() { State visited[MAX_STATES]; int visited_count = 0; State initial_state = {0, 0, 0, 0}; queue[rear].state = initial_state; queue[rear].parent = -1; queue[rear].step = 0; sprintf(queue[rear].action, "初始状态"); rear++; visited[visited_count++] = initial_state; while (front < rear) { State current = queue[front].state; int current_index = front; int current_step = queue[front].step; front++; if (is_goal(current)) { printf("祝贺您! 过河问题求解成功!\n"); print_solution(current_index); return; } for (int i = 0; i < 4; i++) { State next_state = current; next_state.farmer = 1 - next_state.farmer; char action[50]; if (i == 0) { next_state.wolf = 1 - next_state.wolf; sprintf(action, "农夫把狼带到%s", next_state.farmer ? "北岸" : "南岸"); } else if (i == 1) { next_state.goat = 1 - next_state.goat; sprintf(action, "农夫把羊带到%s", next_state.farmer ? "北岸" : "南岸"); } else if (i == 2) { next_state.cabbage = 1 - next_state.cabbage; sprintf(action, "农夫把白菜带到%s", next_state.farmer ? "北岸" : "南岸"); } else { sprintf(action, "农夫独自回到%s", next_state.farmer ? "北岸" : "南岸"); } if (is_safe(next_state) && !is_visited(next_state, visited, visited_count)) { queue[rear].state = next_state; queue[rear].parent = current_index; queue[rear].step = current_step + 1; sprintf(queue[rear].action, "%s", action); rear++; visited[visited_count++] = next_state; } } } printf("未找到解决方案!\n"); } // 主函数 int main() { bfs(); // 开始广度优先搜索 return 0; }分析一下
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值