#JavaScript (ES6), 114 bytes

Takes input as an array of strings. Returns `0` or `1`.

<!-- language: lang-js -->

    a=>(C={},F=x=>!C[c=a[y][x]]|(g=v=>(a[y+v]||[])[x]==c)(-1)|g(1)|g(0,x--)|g(0,x+=2)?a[y+=!c]?F(C[c]=c?x:0):1:0)(y=0)

###Test cases

<!-- begin snippet: js hide: true console: true babel: false -->

<!-- language: lang-js -->

    let f =

    a=>(C={},F=x=>!C[c=a[y][x]]|(g=v=>(a[y+v]||[])[x]==c)(-1)|g(1)|g(0,x--)|g(0,x+=2)?a[y+=!c]?F(C[c]=c?x:0):1:0)(y=0)

    console.log(f([ // 1
      "A"
    ]))

    console.log(f([ // 1
      "AB",
      "AB"
    ]))

    console.log(f([ // 0
      "AB",
      "BA"
    ]))

    console.log(f([ // 1
      "ABCDE"
    ]))

    console.log(f([ // 0
      "ABCDC"
    ]))

    console.log(f([ // 1
      "**::dd22",
      "***:d222",
      "*:::::22"
    ]))

    console.log(f([ // 0
      "$$$%%%&&",
      "$$%%&&&&",
      "&&$$$%&&"
    ]))

    console.log(f([ // 1
      "AABBCDDDE",
      "ABBCCCDEE",
      "ABCCCCDDE",
      "AACCCDDEE",
      "AAAACCCCE",
      "AAAAAACCC"
    ]))

    console.log(f([ // 1
      "AABB",
      "ABBA",
      "AAAA"
    ]))

    console.log(f([ // 1
      "AAAB",
      "AAAA",
      "AAAA"
    ]))


<!-- end snippet -->

###Formatted and commented

<!-- language: lang-js -->

    a => (                            // given an array of strings a
      C = {},                         // C = object holding encountered characters
      F = x =>                        // F = recursive function taking x:
        !C[c = a[y][x]]               //   c = current character; is it a new one?
        | (g = v =>                   //   g = helper function taking v
            (a[y + v] || [])[x] == c  //       and testing whether a[y + v][x] == c
          )(-1)                       //   test a[y - 1][x]
        | g(1)                        //   test a[y + 1][x]
        | g(0, x--)                   //   test a[y][x - 1]
        | g(0, x += 2) ?              //   test a[y][x + 1]; if at least one test passes:
          a[y += !c] ?                //     increment y if c is undefined; if a[y] exists:
            F(C[c] = c ? x : 0)       //       update C, update x and do a recursive call
          :                           //     else:
            1                         //       all characters have been processed -> success
        :                             //   else:
          0                           //     invalid character detected -> failure
    )(y = 0)                          // initial call to F, starting with x = y = 0