方法一

思路:模拟题目中的要求即可,但是由于每次都得判断字符串大小写,所以抽取出了一个函数

  1. func detectCapitalUse(word string) bool {
  2. //如果长度为0或1直接返回true
  3. if len(word) <= 1 {
  4. return true
  5. }
  6. //如果第1个是小写,则全部都要小写
  7. if word[0] <= 'z' && word[0] >= 'a' {
  8. return checkCase(word, 0, false)
  9. } else if (word[0] <= 'Z' && word[0] >= 'A') && (word[1] <= 'Z' && word[1] >= 'A') { //如果第1个是大写,且第2个也是大写,则全都大写
  10. return checkCase(word, 2, true)
  11. } else if (word[0] <= 'Z' && word[0] >= 'A') && (word[1] <= 'z' && word[1] >= 'a') { //如果第1个是大写,第2个是小写,后面的全部都要小写
  12. return checkCase(word, 2, false)
  13. } else {
  14. return false
  15. }
  16. }
  17. //检查字母全部是否都为大写或者小写
  18. //如果flag为true检查大写
  19. //如果flag为false检查小写
  20. func checkCase(word string, i int, flag bool) bool {
  21. var l, r byte
  22. if flag {
  23. l, r = 'A', 'Z'
  24. } else {
  25. l, r = 'a', 'z'
  26. }
  27. for i < len(word) {
  28. if word[i] < l || word[i] > r {
  29. return false
  30. }
  31. i++
  32. }
  33. return true
  34. }

方法二

思路:参考leetcode官方题解

  1. 如果长度小于等于1直接返回true
  2. 如果有两个字符以及以上且第1个字符是大写,从第3个字符往后所有字符的大小写都要与第2个字符的大小写相同。
    注意:还有一种情况我们得考虑:字符串的第1个字符是小写的,第2个字符是大写的,直接返回false,(前提:字符串长度大于等于2)


func detectCapitalUse(word string) bool {
    //如果长度小于等于1直接返回true
    if len(word) <= 1 {
        return true
    }

    //特殊情况:如果第1个字符是小写,第2个字符是大写,直接返回false
    if unicode.IsLower(rune(word[0])) && unicode.IsUpper(rune(word[1])) {
        return false
    }

    i := 2
    for i < len(word) {
        //如果与字符串的第2个字符大小写不一样直接返回false
        if unicode.IsLower(rune(word[i])) != unicode.IsLower(rune(word[1])) {
            return false
        }
        i++
    }

    return true
}